VBA: MàJ dynamique d'une ComboBox.

Fermé
Max Izbak - Modifié par Max Izbak le 5/07/2010 à 17:57
 Max Izbak - 7 juil. 2010 à 17:27
Bonjour, et désolé de ne pas avoir mis un titre plus clair. Le titre complet devrait être:

"Mise à jour d'une ComboBox suite à la réaffectation d'une plage de cellules à un nom."

Pour faire simple, exemple:



Je dispose de 2 ComboBox pour entrer les données initiales, nommées 'cbData1' et 'cb_Data2'.

La cbData1 prend ses données dans la liste 'LISTEDATA1' (dont les valeurs sont "A";"B"), son résultat est stocké dans une case nommée 'VALDATA1'.

La cbData2 prend ses données dans la liste 'LISTEDATA2' (dont les valeurs sont "C";"D";"E";"F"), son résultat est stocké dans une case nommée 'VALDATA2'.

Une 3ème ComboBox, nommée 'cbResult', prend ses données dans la liste 'LISTERESULT', dont la plage de cellules correspondante est variable. Son résultat est stocké dans une case nommée 'VALRESULT'.



Sur la même feuille (mais ce n'est pas une obligation) se trouve un tableau indiquant, pour chaque couple de données possible, les différentes valeurs que peut prendre cbResult.

Ainsi, si je sélectionne "A" en Data1 et "F" en Data2, cbResult doit me donner le choix entre "7" et "8". Mais si je sélectionne "B" et "C", les choix deviennent "9", "10", et "11".



Pour parvenir à mes fins, je parcours ce tableau (au nombre de lignes fixe) à la recherche de la ligne correspondant à mes données d'entrée, puis j'alloue au nom 'LISTERESULT' La plage de cellules correspondant aux résultats situés face à ces données.



Voici le code correspondant:



Private Sub cbData2_Change()

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

Do

j = j + 1

Loop Until Sheets("Feuil1").Cells(i, j + 1) = ""

ActiveWorkbook.Names("LISTERESULT").RefersToR1C1 = "=Feuil1!R" & i & "C10:R" & i & "C" & j

cbResult.ListFillRange = "LISTERESULT"

End If

Next i

End Sub



Tout se passe bien durant la plupart du temps, les lignes et colonnes sont efficacement parcourues, le nom 'LISTERESULT' correspond exactement à la plage de valeurs souhaitée... Mais je n'arrive pas à réintégrer le contenu de 'LISTERESULT' dans ma cbResult. Plus précisément, seule la 1ère valeur de la liste est affichée dans la ComboBox.



J'ai eu l'impression de tourner le problème dans tous les sens, sans succès. Quelqu'un peut-il m'aider?



Merci d'avance. ^^

(Au fait, je programme un fichier xls sur Office 2007, il devra être compatible Office 2003.)

2 réponses

Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 288
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
1
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 » :

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
0