A voir également:
- VBA: MàJ dynamique d'une ComboBox.
- Mkdir vba ✓ - Forum VB / VBA
- Vba récupérer valeur cellule ✓ - Forum VB / VBA
- Excel compter cellule couleur sans vba - Guide
- Vba range avec variable ✓ - Forum VB / VBA
- Vba dépassement de capacité ✓ - Forum Excel
2 réponses
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
293
6 juil. 2010 à 10:43
6 juil. 2010 à 10:43
Bonjour,
ce que tu souhaites faire est simple mais ( il y a toujours un mais) doit respecter certaines règles.
1) initialiser les combobox ( au moins le 1 et le 2)
2) sur l'évènement choisis ( combobox1_change par exemple) effacer combobox3
(comboresult) avec cbesult.clear
3) ajouter les données avec additem
de cette manière cbresult sera toujours à jour.
voici un exemple mais désolé je ne peux pas t'envoyer de fichier...
dans mon exemple ....
combobox1 est une liste en G3:G6
chaque élément de la liste se retrouve en H3:K3
ainsi j'ai mis une liste de H4 à H8 de I4 à I7 ...etc
'quand je sélectionne un élément on passe dans l'évènement _Change
' dans cette partie je suppose que mon filtre est déjà effectué liste H4 à H8 ou I4 à I7.... etc
Private Sub ComboBox1_Change()
Dim C As Variant
Dim nblig As Integer
Dim newPlage As Range
UserForm2.ComboBox2.Clear
' ici je suppose que c'est le résultat de mon filtre.
' et je récupère seulement la liste
poscol = UserForm2.ComboBox1.ListIndex + 1
nblig = Range("G65535").Offset(0, poscol).End(xlUp).Row - 3
' je défini la nouvelle plage
Set newPlage = Range("G3").Offset(1, poscol).Resize(nblig, 1)
' je fais une boucle sur une plage qui peut être variable
For Each C In newPlage
ComboBox2.AddItem C.Value
Next
End Sub
ce que tu souhaites faire est simple mais ( il y a toujours un mais) doit respecter certaines règles.
1) initialiser les combobox ( au moins le 1 et le 2)
2) sur l'évènement choisis ( combobox1_change par exemple) effacer combobox3
(comboresult) avec cbesult.clear
3) ajouter les données avec additem
de cette manière cbresult sera toujours à jour.
voici un exemple mais désolé je ne peux pas t'envoyer de fichier...
dans mon exemple ....
combobox1 est une liste en G3:G6
chaque élément de la liste se retrouve en H3:K3
ainsi j'ai mis une liste de H4 à H8 de I4 à I7 ...etc
'quand je sélectionne un élément on passe dans l'évènement _Change
' dans cette partie je suppose que mon filtre est déjà effectué liste H4 à H8 ou I4 à I7.... etc
Private Sub ComboBox1_Change()
Dim C As Variant
Dim nblig As Integer
Dim newPlage As Range
UserForm2.ComboBox2.Clear
' ici je suppose que c'est le résultat de mon filtre.
' et je récupère seulement la liste
poscol = UserForm2.ComboBox1.ListIndex + 1
nblig = Range("G65535").Offset(0, poscol).End(xlUp).Row - 3
' je défini la nouvelle plage
Set newPlage = Range("G3").Offset(1, poscol).Resize(nblig, 1)
' je fais une boucle sur une plage qui peut être variable
For Each C In newPlage
ComboBox2.AddItem C.Value
Next
End Sub
Bonjour et merci pour l'aide.
Mais entre-temps, j'ai trouvé d'où provenait mon souci : je faisais lire des données en ligne à mon programme, et la ComboBox considérait mes données comme une seule ligne à colonnes multiples. J'ai donc « triché » en passant par une transcription des données dans un tableau temporaire afin de retranscrire mes données en colonne avant de l'intégrer à la liste de résultats.
Ce n'est certainement pas la méthode la plus élégante ni la plus économique en calculs, mais elle a le mérite d'être efficace, et le temps de chargement est toujours plus rapide que le temps nécessaire à l'utilisateur pour bouger sa souris d'une ComboBox à l'autre. ^^
Voici le code corrigé « à ma façon » :
Merci de vous être penché sur mon problème en tout cas. Je garde votre idée en mémoire pour comparer les méthodes à l'occasion. ;-)
Configuration: Windows XP / Internet Explorer 6.0
Mais entre-temps, j'ai trouvé d'où provenait mon souci : je faisais lire des données en ligne à mon programme, et la ComboBox considérait mes données comme une seule ligne à colonnes multiples. J'ai donc « triché » en passant par une transcription des données dans un tableau temporaire afin de retranscrire mes données en colonne avant de l'intégrer à la liste de résultats.
Ce n'est certainement pas la méthode la plus élégante ni la plus économique en calculs, mais elle a le mérite d'être efficace, et le temps de chargement est toujours plus rapide que le temps nécessaire à l'utilisateur pour bouger sa souris d'une ComboBox à l'autre. ^^
Voici le code corrigé « à ma façon » :
Private Sub cbData2_Change() 'MàJ de RESULT. For i = 2 To 9 If Sheets("Feuil1").Range("H" & i).Value = Range("VALDATA1").Value And Sheets("Feuil1").Range("I" & i).Value = Range("VALDATA2").Value Then j = 9 ibis = 1 'index de colonne pour le tableau temporaire ("tt"). jdeb = 1 '1ère ligne du tt, ici à 1 mais ça dépend des cas. jfin = 0 'dernière ligne du tt, égale à jdeb - 1. Do j = j + 1 'on compte toujours la longueur de la liste... jfin = jfin + 1 '... mais on incrémente aussi le compteur de dernière ligne. 'copie de la ligne vers la colonne: Sheets("Feuil2").Cells(jfin, ibis).Value = Sheets("Feuil1").Cells(i, j).Value Loop Until Sheets("Feuil1").Cells(i, j + 1) = "" 'attribution de la colonne nouvellement créée à LISTERESULT: ActiveWorkbook.Names("LISTERESULT").RefersToR1C1 = "=Feuil2!R" & jdeb & "C" & ibis & ":R" & jfin & "C" & ibis cbResult.ListFillRange = "LISTERESULT" 'Remplissage de la combobox. End If Next i End Sub
Merci de vous être penché sur mon problème en tout cas. Je garde votre idée en mémoire pour comparer les méthodes à l'occasion. ;-)
Configuration: Windows XP / Internet Explorer 6.0