J'ai un classeur qui est programmé à l'ouverture pour ouvrir une nouvelle copie d'un deuxième classeur et enregistrer la valeur du nom du deuxième livre dans une variable accessible par une sous-routine privée pour un contrôle ActiveX.

Dans un module séparé, j'ai la valeur :

'variable holding the name of the new workbook
Public sarname As String

Dans l'objet 'ThisWorkbook' j'ai le code :

Private Sub Workbook_Open()

'creates a new workbook and saves name in public variable
Dim SARWorkbook As Workbook
Set SARWorkbook = Workbooks.Add("C:\Users\...xlsm")
Module1.sarname = SARWorkbk.Name

End Sub

Enfin, j'utilise cette valeur dans le code :

Private Sub FilBox1_Click()

'If box is checked, a "Yes" string is entered into range object of new workbook with name saved in Module1.sarname
If FilBox1.Value = True Then
     Workbooks(Module1.sarname).Worksheets("COC Form").Range("b46").Value = "Yes"
Else
     Workbooks(Module1.sarname).Worksheets("COC Form").Range("b46").Value = "No"
End If

End Sub

Le contrôle ActiveX après avoir répondu à son état, est censé placer une réponse "oui" ou "non" dans une cellule du nouveau classeur en utilisant le nom stocké dans "sarname". Après avoir fait quelques recherches avec MsgBox, je sais que la valeur est stockée dans la variable mais la sous-routine privée ne la voit que comme "", et j'obtiens une erreur d'exécution 13.

Je n'ai pas ce problème avec d'autres sous-marins privés qui font référence à des variables publiques, donc je ne sais pas où cela ne va pas.

Prenant conseil à partir d'une réponse à une question similaire, j'ai adopté une approche différente et j'ai écrit dans mon module :

Public Property Get Somesarname() As String

Somesarname = sarname

End Property

J'ai ensuite utilisé 'somesarname' dans mon sous-marin FilBox1. Cela m'obtient une erreur « indice hors plage » et « somesarname » s'affiche toujours sous la forme «  » lorsque je passe le curseur dessus.

Je suis totalement perplexe maintenant. Quelle chose de base me manque-t-il ici ?

0
KeithK 19 nov. 2019 à 23:19

1 réponse

Meilleure réponse

Plus simple comme ça :

Public wbSAR As Workbook   '<< public variable in Module1 

'in ThisWorkbook module
Private Sub Workbook_Open()
    Set wbSAR = Workbooks.Add("C:\Users\...xlsm") 'Set the workbook reference
End Sub

Puis plus tard:

'If box is checked, a "Yes" string is entered into range object of new workbook wbSAR
wbSAR.Worksheets("COC Form").Range("B46").Value = IIf(FilBox1.Value, "Yes", "No")

EDIT: approche alternative utilisant des constantes pour le chemin et le nom wb

'Constants in module1
Public Const WB_PATH As String = "C:\Folder1\Folder2\"   
Public Const WB_NAME As String = "ThisIsIt.xlsm"   

'in ThisWorkbook module
Private Sub Workbook_Open()
    Workbooks.Add(WB_PATH & WB_NAME) 
End Sub
Then later:

'If box is checked, a "Yes" string is entered into range object of new workbook wbSAR
Workbooks(WB_NAME).Worksheets("COC Form").Range("B46").Value = IIf(FilBox1.Value, "Yes", "No")
0
Tim Williams 20 nov. 2019 à 18:52