Bonjour à tous,
Voici mon problème : sur le 1er clic sur un CommandButton toutes les variables globales sont effacées et les OLEObjects sont déréférencés. Les clics suivants ne posent pas de problème.
Voici le code VBA :
ThisWorkBook :
Feuil1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Sub Workbook_Open() Init Debug.Print "Workbook_Open(), TestVar = ", TestVar 'Afficher la valeur après l'init. End Sub
Module1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Private Sub BtnTest_Click() Debug.Print "BtnTest_Click(), TestVar = ", TestVar 'A chaque clic afficher la valeur ' à l'entrée dans la routine TestVar = 12 ' puis recharger la variable. End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Public TestVar As Long Public TestButton As OLEObject '----------------------------------------------------------------------------------------------- Public Sub Init() Dim Ctrl As Object For Each Ctrl In ThisWorkbook.Worksheets("Feuil1").OLEObjects Ctrl.Delete 'Effacer tout objet présent. Next Ctrl 'Création du bouton. Set TestButton = ThisWorkbook.Worksheets("Feuil1").OLEObjects.Add( _ ClassType:="Forms.CommandButton.1", _ DisplayAsIcon:=False, _ Left:=100, Top:=10, Width:=50, Height:=30) TestButton.Name = "BtnTest" TestButton.Object.Caption = "Test" TestVar = 55 'Init de la variable globale. End Sub
En utilisant la fenêtre d'exécution on peut voir que TestVar prend les valeurs 55, 0, 12, 12, 12...
Elle est correcte après la création du CommandButton, elle est effacée sur le 1er clic du bouton, et les clics suivants sont corrects.
Le problème n'est pas lié au lancement du code par Workbook_Open(). Il apparaît même si le code est lancé par une macro ordinaire.
Le problème est le même pour des variables objet. Si j'avais créé un autre contrôle AutreCtrl et que j'aie besoin de lire sa valeur il faudra que je le re-référence d'abord :
Set AutreCtrl = ThisWorkbook.Worksheets("Feuil1").OLEObjects("NomDuControle")
sinon "Erreur d'exécution 91 : variable objet non définie". Une fois le contrôle re-référencé je peux lire sa valeur, elle a été correctement conservée.
J'ai lu sur certain forums que la création d'OLEObjects dans une feuille peut effacer les variables globales (bug apparemment connu). Mais ici la variable est initialisée après la création du bouton.
Même comportement avec un OptionButton ou un SpinButton.
Pour contourner le problème je suis obligé de stocker les variables globales dans une feuille, mais c'est vraiment cracra !
Y a-t-il un problème avec mon code ? Quelqu'un a une idée ou a connaissance de ce problème ?
Merci d'avance.
Partager