2 combobox en cascade - Valeurs horizontales - Enlever vides

Bonjour à tous,

Je suis débutant en VBA. J'ai fait beaucoup d'essais et erreurs pour arriver où j'en suis avec ce petit projet... J'ai 2 combobox en cascade : le premier avec les pays qui sont dans la colonne A et les villes se retrouvant dans le 2e combobox sont dans les colonnes B et les subséquentes. Les combobox sont sur une feuille différente que celle où les données se trouvent. Chaque pays ne contient pas exactement le même nombre de villes. J'ai joint un fichier pour rendre la chose plus claire. Éventuellement, j'aimerais ajouter beaucoup plus de pays (au moins une centaine).

À date, j'ai réussi à peupler le 2e combobox grâce à la sélection du 1er (les villes associées à un pays), par contre il y a des vides :

Private Sub ComboBox1_Change()

Me.ComboBox2.Clear

Dim rngVilles As Range

Set rngVilles = ThisWorkbook.Sheets("PaysVille").Range("B3:G5").Offset(Me.ComboBox1.ListIndex - 1)

ComboBox2.List = _

WorksheetFunction.Transpose(rngVilles)

ComboBox2.ListIndex = 0

End Sub

Pour tenter de résoudre le problème, j'ai réussi à trouver le code ici-bas qui enlève les vides (j'attends qu'il soit au point pour le mettre dans ComboBox1_Change()), mais je ne réussis pas à faire en sorte qu'il ne donne que les valeurs (villes) du pays sélectionné dans le 1er combobox. Il va chercher toutes les villes de tous les pays dans la plage... Je ne m'y prends certainement pas de la bonne façon et ne suis qu'à mes premiers balbutiements de codage VBA, donc je sollicite votre aide.

Private Sub AjouterValeursNonVidesSelonSelectionDu1erAu2eCombo()

Me.ComboBox2.Clear

With Worksheets("PaysVille")

For Each r In ThisWorkbook.Sheets("PaysVille").Range("B3:G5").Offset(Me.ComboBox1.ListIndex - 1)

If r.Value <> "" Then ComboBox2.AddItem r.Value

Next r

End With

End Sub

Merci,

Bonjour

Un essai à tester. Te convient-il ?

Bye !

Bonjour et merci pour la réponse,

Je ne vois que de nouveaux pays et villes dans la liste. Le 2e combobox comporte encore des vides à la fin, et même le premier. J'ai mis -1 au bout de (Me.ComboBox1.ListIndex - 1), car je veux qu'il y ait une valeur vide avant toutes les autres valeurs seulement. Désolé, je n'avais pas précisé.

Merci de m'aider,

Nouvel essai.

Bye !

Bonjour gmb,

Ça marche au poil ! Merci pour le temps ! La seule petite chose qui me manque maintenant, c'est d'avoir une valeur vide comme première valeur du combobox1 (avoir l'équivalent des valeurs A2:A7 dans ce combobox) pour que par défaut ce soit la valeur vide de A2 (ou toute autre façon d'obtenir une valeur vide en premier) qui apparaisse et qu'il n'y ait rien de présélectionné. S'il existe une autre façon de faire sans que la ligne 2 existe dans la feuille PaysVille, ce serait aussi très bon... Ensuite, si la valeur vide (disons A2) est sélectionnée de nouveau, ça permet de vider le combobox2 (réinitialiser si on veut), mais lorsqu'il y a une valeur dans le combobox1, c'est excellent s'il n'y a aucune valeur vide dans le combobox2.

J'ai tenté de modifier la formule DECALER et le Sub ComboBox1_Change(), sans succès.

Merci encore de votre aide,

ExcelSieur a écrit :

S'il existe une autre façon de faire sans que la ligne 2 existe dans la feuille PaysVille, ce serait aussi très bon

Que veux-tu dire ? Tu ne veux plus de ligne vide entre les titres et les listes ?

A te relire.

Que cette ligne existe ou non, ça ne me dérange pas; idéalement, c'est d'avoir ce qui est le plus simple à programmer... Tant que le résultat soit que dans le combobox1 on ait une valeur vide en premier, ce qui permet à la personne de pouvoir sélectionner une valeur plutôt que d'en avoir une imposée à l'ouverture du fichier...

Alors, voilà un compromis : il y a une ligne vide mais masquée.

Bye !

Trop fort ! C'est exactement ce que je cherchais à accomplir !

Je vous en dois une gmb.

Il me reste maintenant à assimiler toute cette connaissance !

Merci énormément,

Rechercher des sujets similaires à "combobox cascade valeurs horizontales enlever vides"