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:
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
Si je mets les deux lignes indiquées dans le Bouton1, j'obtiens la sortie suivante sur la console:
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 :-)