Problème Combobox en cascade 3 niveaux

VinceNC

XLDnaute Nouveau
Bonjour à tous,

Désolé de venir vous embêter avec ça mais je patauge avec les Combobox en cascade de mon Userform.
Pas de problème pour définir la liste de la première Combobox mais ensuite j'ai une erreur d'execution 424 que je ne comprends pas au niveau du passage en gras.

J'ai fouillé sur le forum mais le code me paraît correct.

Private Sub UserForm_Initialize()

'Combobox en cascade

Set f = Sheets("Liste")
Set mondico = CreateObject("Scripting.Dictionary")
For Each C In Range(f.[A2], f.[A300].End(xlUp))
mondico(C.Value) = C.Value
Next C
Me.ComboBox3.List = mondico.items
End Sub

Private Sub ComboBox3_Change()
Set mondico = CreateObject("Scripting.Dictionary")
For Each C In Range(f.[A2], f.[A300].End(xlUp))
If C = Me.ComboBox3 Then mondico(C.Offset(, 1).Value) = C.Offset(, 1).Value
Next C
Me.ComboBox4.List = mondico.items
Me.ComboBox4.ListIndex = -1
Me.ComboBox5.ListIndex = -1
End Sub

Private Sub ComboBox4_Change()
Set mondico = CreateObject("Scripting.Dictionary")
For Each C In Range(f.[A2], f.[A300].End(xlUp))
If C = Me.ComboBox3 And C.Offset(, 1) = Me.ComboBox4 Then mondico(C.Offset(, 2).Value) = C.Offset(, 2).Value
Next C
Me.ComboBox5.List = mondico.items
Me.ComboBox5.ListIndex = -1
End Sub

Un avis d'expert ?

En PJ, le fichier
 

Pièces jointes

  • PPI.xlsm
    37 KB · Affichages: 112

mephis

XLDnaute Occasionnel
Re : Problème Combobox en cascade 3 niveaux

Bonjour, je trouve que tu t'es compliqué la vie, il te suffisait de mettre


Private Sub userform_initialize()
ComboBox1.AddItem "..." ' mettre entre les guillemets ce qui se trouvera dans votre 1ere combobox
end sub

Private Sub ComboBox1_Change()
ComboBox2.Clear

If ComboBox1 = "..." Then
ComboBox2.AddItem "..." ' mettre entre les guillemets ce qui se trouvera dans votre 2eme combobox
End If

end sub


Et la même chose pour la troisième combobox
 

mécano41

XLDnaute Accro
Re : Problème Combobox en cascade 3 niveaux

Bonjour,

Bonjour, je trouve que tu t'es compliqué la vie, il te suffisait de mettre

Private Sub userform_initialize()
ComboBox1.AddItem "..." ' mettre entre les guillemets ce qui se trouvera dans votre 1ere combobox
end sub

Private Sub ComboBox1_Change()
ComboBox2.Clear

If ComboBox1 = "..." Then
ComboBox2.AddItem "..." ' mettre entre les guillemets ce qui se trouvera dans votre 2eme combobox
End If

end sub

Et la même chose pour la troisième combobox

... je ne suis pas sûr de t'avoir compris ... mais il veut des boîtes en cascade ...(la deuxième n'affichant que les éléments correspondant à l'élément sélectionné dans la première et ainsi de suite)

Cordialement
 

mephis

XLDnaute Occasionnel
Re : Problème Combobox en cascade 3 niveaux

oui c'est ce que fait mon programme

Private Sub userform_initialize()
ComboBox1.AddItem "A" ' mettre entre les guillemets ce qui se trouvera dans votre 1ere combobox
ComboBox1.AddItem "B"
end sub

Private Sub ComboBox1_Change()
ComboBox2.Clear

If ComboBox1 = "A" Then
ComboBox2.AddItem "a" ' mettre entre les guillemets ce qui se trouvera dans votre 2eme combobox
ComboBox2.AddItem "b"
End If


If ComboBox1 = B" Then
ComboBox2.AddItem "1" ' mettre entre les guillemets ce qui se trouvera dans votre 2eme combobox
ComboBox2.AddItem "2"
End If
end sub

Avec ce programme si la combobox1 n'est pas renseigné la 2 est vide, et si il y a "A" dans la 1 il n'y aura que "a" et "b" dans la deux, c'est bien ça qu'il faut non?
 

mécano41

XLDnaute Accro
Re : Problème Combobox en cascade 3 niveaux

On ne sait pas a priori ce qui sera dans la seconde boîte en fonction de la sélection dans la première...donc pour le "mettre entre guillemets"... ; le seul moyen que je connaisse (mais il y en a peut-être d'autres...) est l'utilisation du dictionnaire comme VinceNC l'as fait.

Enfin comme je l'ai dit, je n'ai pas compris ce que tu veux faire... peut-être avec un exemple basé sur le fichier de VinceNC...

Cordialement
 

mécano41

XLDnaute Accro
Re : Problème Combobox en cascade 3 niveaux

Nous sommes d'accord.

Pour info. le fichier de VinceNC avec juste comme modification la déclaration de la feuille f au niveau module. Et cela fonctionne. (j'ai ajouté un bouton pour ouvrir la boîte de dialogue)

L'utilisation du dictionnaire permet d'ajouter (ou retrancher) des lignes avec des éléments nouveaux dans les listes sans devoir modifier le code.

Cordialement
 

Pièces jointes

  • Copie de PPI.xlsm
    30.2 KB · Affichages: 173

VinceNC

XLDnaute Nouveau
Re : Problème Combobox en cascade 3 niveaux

Bonjour,
et merci à vous de vous êtes penchés sur mon problème.

mephis : il m'était impossible de déclarer tous les items. Comme l'a rappelé mécano41 mes listes sont dépendantes les unes des autres et en plus, je n'ai mis qu'un extrait du fichier puisque j'ai environ 200 Items qui pourraient être modifiés par la suite.

mécano41 : c'est bien un problème de déclaration. Dans mon code, la déclaration de f en amont du code comme tu le proposes ne fonctionne pas. J'ai résolu le problème en déclarant f dans chacune des Sub.

Merci à vous
 

mécano41

XLDnaute Accro
Re : Problème Combobox en cascade 3 niveaux

Bonjour,

mécano41 : c'est bien un problème de déclaration. Dans mon code, la déclaration de f en amont du code comme tu le proposes ne fonctionne pas. J'ai résolu le problème en déclarant f dans chacune des Sub.

Merci à vous

Attention! la déclaration au niveau module "Dim f As Worksheet" ne suffit pas ; il faut aussi mettre la définition de F dans le premier Sub appelé, à savoir :

Code:
Private Sub UserForm_Initialize()
Set f = Sheets("Liste")
... etc

Cordialement
 

Discussions similaires

Réponses
6
Affichages
202