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 :
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
Feuil1:
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
Module1:
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.