[vba] obtenir l'handle de la liste déroulante d'un combobox d'une feuille excel

Description

Obtenir l'handle de la liste déroulante d'un combobox posé sur une feuille excel. Un combobox est composé d'une zone de texte et d'une liste (déroulante). Placé sur une feuille excel, il n'est pas facile d'identifier le handle de la liste déroulante. J'ai utilisé Spy++ pour déterminer les class names de la liste déroulante. Après, un simple coup d'API permet d'obtenir le handle de la liste déroulante d'un combobox placé sur une feuille. C'est un module facilement réutilisable pour vos documents excel.

Source / Exemple :


'-------------------------
' Dans une feuille excel :
'
Private Sub ComboBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If hWndDropListCombo = 0 Then
        hWndDropListCombo = GetHandleDropListFromCombo
        ' ajoutez ici votre code pour utiliser cet handle
        ' ...
    End If
End Sub
Private Sub ComboBox1_LostFocus()
    hWndDropListCombo = 0
End Sub

'-----------------
' Dans un module :
'
Public hWndDropListCombo As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Function GetHandleDropListFromCombo() As Long
    Dim hWndExcel As Long
    Dim hWndPopup As Long
    Dim hWndList As Long
    Const VBA_POPUP_CLASSNAME = "F3 MdcPopup 60000000"
    Const VBA_LIST_CLASSNAME = "F3 Server 60000000"
    ' retourne l'handle d'excel
    hWndExcel = FindWindow("XLMAIN", vbNullString)
    'trouve celui du popup
    hWndPopup = FindWindowEx(hWndExcel, 0&, VBA_POPUP_CLASSNAME, vbNullString)
    If hWndPopup = 0 Then
        hWndPopup = FindWindow(VBA_POPUP_CLASSNAME, vbNullString)
    End If
    'trouve celui de la liste dans le popup
    hWndList = FindWindowEx(hWndPopup, 0&, VBA_LIST_CLASSNAME, vbNullString)
    GetHandleDropListFromCombo = hWndList
End Function

Conclusion :


La fonction GetHandleDropListFromCombo doit-être appelée lorsque la liste déroulante est déjà affiché. Si elle est appelée avant son affichage, alors son handle ne sera pas trouvée. C'est pour ça qu'elle est placée dans l'évènement mouseup du combo.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.