Bonjour,
Voici le contexte de mon travail:
J'aimerais utiliser une combo à plusieurs colonnes et plus agréable à utiliser pour sélectionner une valeur de cellule parmi un très grand nombre de valeur (plusieurs centaine).
Pour cela, je crée une combobox ActiveX dans une fonction et je l'assigne à un objet de classe local qui doit gérer le changement de valeur et cacher la combo une fois que l'utilisateur aura sélectionné la valeur.
Mon problème:
Si je créer l'objet ActiveX et l'assigne à mon objet de classe dans la même fonction, alors ma classe est automatiquement détruite à la fin de la fonction, comme si j'avais une variable de scope local... Si je créer l'ActiveX dans une fonction et l'assigne dans une autre (par exemple avec 2 macro boutons), alors tout se passe correctement.
J'ai aussi un problème avec le debugger car je ne peux plus entrer en mode debuggage dans la fonction dès que l'objet ActiveX a été créé (message "Impossible d'entrer en mode arrêt maintenant").
Mon code:
J'arrive à reproduire le problème avec ce code:
1) Mon module de classe:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Option Explicit Option Base 1 ' Global objects Private WithEvents gMSCombo As MSForms.Combobox ' OLEObject ' Create combo object Public Sub Class_Initialize() Debug.Print "claSelectionCombo::Class_Initialize" End Sub Public Property Let Object(combo As MSForms.Combobox) Set gMSCombo = combo End Property Public Property Get value() As String value = gMSCombo.value End Property Public Property Let value(newValue As String) gMSCombo.value = newValue End Property ' Delete combo object Public Sub Class_Terminate() Debug.Print "claSelectionCombo::Class_Terminate" End Sub
2) Mon module:
Si je mets les deux lignes indiquées dans le Bouton1, j'obtiens la sortie suivante sur la console:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 Option Explicit Option Base 1 ' Objects global to module Private gSelectCombo As claSelectionCombo Sub Bouton1_Cliquer() Dim obj As MSForms.Combobox Set obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, _ DisplayAsIcon:=False).Object ' Problème dès que j'insère ces deux lignes: Set gSelectCombo = New claSelectionCombo gSelectCombo.Object = obj End Sub Sub Bouton2_Cliquer() Dim value As String Dim obj As MSForms.Combobox If (gSelectCombo Is Nothing) Then Debug.Print "Create class object" Set gSelectCombo = New claSelectionCombo Set obj = ActiveSheet.OLEObjects(1).Object gSelectCombo.Object = obj Else Debug.Print "Use existing class object" End If value = gSelectCombo.value Debug.Print "Value is: " & value MsgBox "Value is: " & value End Sub
claSelectionCombo::Class_Initialize
claSelectionCombo::Class_Terminate
Et un click sur le Bouton2 nécessite de réinitialiser ma classe (message "Create class object")
Savez-vous pourquoi j'ai ce comportement?
Comment puis-je assigner directement un objet ActiveX nouvellement créé à ma classe?
Par ailleurs, j'ai cherché de la documentation de référence sur les combobox ActiveX (pour connaître les événements observables, les propriétés, etc.) mais je n'ai pas trouvé sur le site de Microsoft (j'ai trouvé cette référence https://msdn.microsoft.com/en-us/lib.../ff840691.aspx mais elle n'indique pas les mêmes méthode que dans l'editeur VBA...). Savez-vous où je peux trouver de la documentation?
Merci par avance pour votre aide :-)
Partager