Code à exécuter avec combobox

Bonjour,

J'ai dans une feuille de calcul une combobox (active X), quel type de procédure choisir (par exemple _click() ; _change(); ...) pour exécuter du code quand :

Etape 1 : L'utilisateur clique sur la combobox pour faire apparaître la liste déroulante de choix ?

puis

Etape 2 : L'utilisateur click sur une valeur dans la liste

avec _click() ou _change() le code s'effectue dans les deux cas, avec _dropbuttonclick() le code s'effectue à l'apparition et à la disparition de la liste (donc 2 fois).

Pour le 1. je pense que _gotfocus() fonctionnerait mais je ne suis pas sur. Et pour le 2 je n'ai pas d'idée.

Pour détailler un peu, dans l'étape 1 je souhaite mettre du code qui construit la liste de choix déroulant à partir d'un grand tableau (ça revient à éliminer des doublon en gros), et le code de l'étape 2 effectue des opérations en fonction de la valeur choisie dans la liste, d'où l'obligation de réaliser ces 2 étapes de manière séparée.

Bonjour,

Si tu veux que concrètement des contributeurs te proposent des solutions adaptées à ta situation ...

Merci de ta réponse, au moment où j'ai posté je n'avais pas écrit de code à l'intérieur des procédure événementielle (juste des msgbox pour tester, ça ne vous aurez pas aider à grand chose...

Maintenant j'en ai un peu et il est en PJ.

La macro fonctionne, mais pas de manière optimale :

le combobox_dropbuttonclick() exécute le code quand on ouvre la liste mais aussi une deuxième fois quand on la ferme. En soit ce n'est pas grave, c'est juste inutile.

Le combobox_lostfocus() fonctionne aussi mais ne s'active que lorsque l'on click ailleurs, alors qu'idéalement je voudrais que le code se lance dès le choix dans la combobox

Est-ce qu'il y aurait une possibilité de lancer le deuxième code depuis l'intérieur du premier code ? du genre une instruction

Combobox_dropbuttonclick() :

if le click ouvre la liste then faire le premier code

elseif la liste était déjà ouverte then basculer sur le deuxième code

endif

64classeur11.xlsm (56.73 Ko)

Bonjour toutes et tous

pour ta 1ère demande :

en essayant d'ajouter lors du clic de ton combobox1 de ta feuille

comme ceci:(tu peux modifier la cellule A1 de ce code 'voir pour l'exemple')

Private Sub ComboBox1_Click()
ActiveSheet.Range("A1").Select
End Sub

pour la seconde : je n'ai pas regardé

crdlt,

André

Salut Andre13, Butters

essaie ca:

Private Sub ComboBox1_Change()
Dim Twrk, drlng
Dim i As Integer, j As Integer
Application.ScreenUpdating = False
Set Twrk = ThisWorkbook.Sheets("BigData")

'Trouver la dernière ligne du tablea (qui sera j-1)
drlng = Twrk.Cells(Rows.Count, 1).End(xlUp).Row

''copie la première ligne correspondant au nom en I1 et la colle dans les champs sources des 2 graphiques
For i = 37 To j - 1
    If Twrk.Cells(i, 1).Value = Twrk.Cells(1, 9).Value Then
        Twrk.Range("A" & i & ":AO" & i).Copy
        Twrk.Range("A20").Select
        ActiveCell.PasteSpecial Paste:=xlPasteValues
        Twrk.Range("A27").Select
        ActiveCell.PasteSpecial Paste:=xlPasteValues
        Exit For
    Else
    End If
Next

Application.ScreenUpdating = True

End Sub

Private Sub ComboBox1_dropbuttonclick()

Dim i As Integer, j As Integer, drlng
Dim Twrk, tbl, elmt
 Set Twrk = ThisWorkbook.Sheets("BigData")

'nettoyer les noms de la liste
 ComboBox1.Clear

drlng = Twrk.Cells(Rows.Count, 1).End(xlUp).Row

'trier par nom puis par date
ThisWorkbook.Sheets("BigData").Range("A37:AO" & drlng).Sort _
key1:=Range("A38"), Order1:=xlAscending, key2:=Range("b38"), Order2:=xlAscending

'Ajouter le premier nom
ComboBox1.AddItem ThisWorkbook.Sheets("BigData").Cells(37, 1).Value

Dim dic

Set dic = CreateObject("Scripting.Dictionary")
For i = 38 To drlng
           dic(Twrk.Cells(i, 1).Value) = ""
Next

tbl = Range("A38:" & "A" & drlng)
For Each elmt In tbl
    dic(elmt) = ""
Next elmt
tbl = dic.keys
ComboBox1.List = tbl

If ComboBox1.ListCount > 8 Then
    ComboBox1.ListRows = 8
Else
    ComboBox1.ListRows = ComboBox1.ListCount
End If

Application.ScreenUpdating = True

End Sub

Bonjour à vous 2 et merci pour vos proposition

@Andre13 :

Effectivement le _click() fonctionne bien et ne se lance qu'une fois et avec le bon timing merci

@AMIR

Merci pour toutes tes modifs et optimisation du code, ça le rend plus élégant, j'ai juste changé une variable j en drlgn dans une boucle for et j'ai remis les quelques lignes pour vider la liste à place du combobox1.clear, car sinon la boîte n'affiche rien une fois fermée (j'ai supposé que le clear supprimait les propriétés de la boite, dont la valeur à afficher)

En revanche ta proposition ne résout pas mon problème, le code se lance toujours 2 fois avec le _dropbuttonclick() et la deuxième procédure avec le _change() se lance même trois fois maintenant.

Rechercher des sujets similaires à "code executer combobox"