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
- Messages
- 2'415
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
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
@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.