Listes déroulantes dépendantes (Cas de Pays et Villes)

Bonjour,

J'ai besoin d'aide dans un schéma très simple dans un formulaire. Ce que je dois faire est de configurer 2 listes déroulantes, la première montre les pays et la seconde montre les villes des pays au-dessus. (Je veux que les villes s'affichent correctement lorsque je sélectionne le pays ci-dessus)

Je n'ai que 2 pays, que j'ai pu facilement situer avec "row source", mais j'ai du mal à faire apparaître la liste déroulante des villes. J'ai essayé 3 façons différentes mais ça ne marche pas.

<pre>
Dim colonne As Integer
Dim i As Integer, j As Integer

Private Sub Userform_initialize()
colonne = 2
Sheets("L1").Range("B2:C2").Interior.ColorIndex = Clear
Do While Sheets("L1").Cells(2, colonne).Value <> ""
Userform.cboCountry.AddItem Cells(2, colonne).Value
colonne = colonne + 1
Loop
End Sub

Private Sub cboCountry_Change()
i = 2
Userform.cboCity.Clear
Sheets("L1").Range("B2:C2").Interior.ColorIndex = Clear
Do While Sheets("L1").Cells(2, colonne).Value <> ""
If Cells(2, i).Value = cboCountry.Value Then
Cells(2, i).Select
ActiveCell.Interior.ColorIndex = 32
colonne = ActiveCell.Column
End If
i = i + 1
Loop
j = 3
Do While Cells(j, colonne).Value <> ""
Userform.cboCity.AddItem Cells(j, colonne)
j = j + 1
Loop
cboCity.ListIndex = 0
End Sub 
</pre>

<pre>
Dim colonne As Integer
Dim i As Integer, j As Integer

Private Sub Userform_initialize()
colonne = 2
Sheets("L0").Range("B2:C2").Interior.ColorIndex = Clear
Do While Sheets("L1").Cells(2, colonne).Value <> ""
Userform.cboCountry.AddItem Cells(2, colonne).Value
colonne = colonne + 1
Loop
End Sub

Private Sub cboMarque_Change()
With L0
Col = .Rows(2).Cells.Find(cboCountry.Value, LookAt:=xlWhole).Column
cboCity.Clear
cboCity.List = .Range(.Cells(3, Col), .Cells(.Cells(Rows.Count, Col).End(xlUp).Row, Col)).Value
End With
End Sub 
</pre>

<pre>
Private Sub UserForm_Initialize()
With cboCountry
.AddItem "Canada"
.AddItem "USA”
End With
End Sub

Private Sub  cboCity_Change()
Dim index As Integer
index = cboCity.ListIndex
 cboCity.Clear
Select Case index
Case Is = Canada
With  cboCity
.AddItem "Toronto"
.AddItem "Ottawa"
.AddItem "Montreal"
.AddItem "Vancouver"
End With

Case Is = USA
With  cboCity
.AddItem "Boston"
.AddItem "Miami"
.AddItem "Akron"
.AddItem "Houston”
End With
End Select
End Sub 
</pre>

Svp dites-moi quel code est le plus simple (ou le plus fiable) et que dois-je modifier pour que ca marche. (L0 est les sources de ligne du tableau des pays et L1 est juste une feuille avec chaque pays avec ses villes ci-dessous)

Si vous avez des idées plus simples, n'hésitez pas. Merci d'avance</p>

Re,

Même combat que pour ton premier post...

Désolé, je ne suis pas encore habitué.

Voici le fichier

10vba-pays.xlsm (28.15 Ko)

Bonjour Ronnie, bonjour le forum,

En pièce jointe ton fichier modifié. J'ai supprimé un onglet inutile, supprimé la propriété RowSource de la première ComboBox alimentée à l'initialisation de l'UserForm. Modifié les deux tableaux de pays en un seul : Tableau1.

Le code :

Private OL As Worksheet 'déclare la variable OL (onglet Liste)
Private TS As ListObject 'déclare la variable TS (Tableau Structuré)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set OL = Worksheets("Liste") 'définit l'onglet oL
Set TS = OL.ListObjects(1) 'définit le tableau structuré TS
Me.cboCountry.List = Application.Transpose(TS.HeaderRowRange.Value) 'alimente la ComboBox [cboCountry]
End Sub

Private Sub cboCountry_Change() 'au changement dans la Combobox
Dim COL As Byte 'déclare la variable COL (COLonne)

Me.cboCity.Clear 'vide la ComboBox
COL = Me.cboCountry.ListIndex + 1 'définit la variable COL
For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I de TS
    'ajoute la donnée ligne I colonne COL à la ComboBox si elle n'est pas vide
    If TS.DataBodyRange(I.COL) <> "" Then Me.cboCity.AddItem TS.DataBodyRange(I, COL)
Next I 'prochaine ligne de la boucle
End Sub

Le fichier :

Bonjour Thau, merci énormément pour ta réponse tout d'abord.

J'ai essayé d'exécuter le fichier que tu m'as envoyé mais quand j'active ma première liste et j'appuie sur le pays, je reçois une erreur d'exécution '424'.

Le débogage pointe vers la ligne " If TS.DataBodyRange(I.COL) <> "" Then".

Hello,

Si vous voulez vous pouvez le faire par formule de manière relativement simple et ensuite vous appelez la plage nommée ?

Ca vous intéresserait ?

Hello Baroute,

Oui bien sûr, si t'as d'autres idées n'hésites surtout pas :)

Bonjour Ronnie45, Le Forum,

Avec le code modifié ci-dessous.

Private Sub cboCity_enter()
Dim index As Integer
index = cboCountry.ListIndex
 cboCity.Clear
'Nombre de villes dans la colonne du Pays cible
Col = index + 2
'Base forfaitaire de 2000 lignes pour les villes
Der = Sheets("L1").Cells(2000, Col).End(xlUp).Row
With Me.cboCity
For c = 2 To Der
.AddItem Sheets("L1").Cells(c, Col)
Next c
End With
End Sub

Salut x cellus,

Ton code marche bien sauf que les deux pays se sont échangés de villes (USA m'affiche des villes canadiennes et le Canda m'affiche des villes américaines)

Qu'est ce que je pourrais modifier pour régler cela ? Merc d'avance.

Bonjour le fil, bonjour le forum,

J'ai essayé d'exécuter le fichier que tu m'as envoyé mais quand j'active ma première liste et j'appuie sur le pays, je reçois une erreur d'exécution '424'.

Oui désolé, en effet il y avait un bug. Il faut remplacer le point par une virgule :

If TS.DataBodyRange(I.COL) <> "" Then Me.cboCity.AddItem TS.DataBodyRange(I, COL)
If TS.DataBodyRange(I, COL) <> "" Then Me.cboCity.AddItem TS.DataBodyRange(I, COL)

A nouveau,

J'ai été un peu rapide vers midi (la faim sans doute). En fait j'ai inversé en feuille L1 les 2 pays pour les placer par ordre alphabétique.

Donc Canada et ses villes en colonne B et faire de même pour la colonne C avec USA.

Hello ma propal avec deux zones nommées

@+

9vba-pays-1.xlsm (29.08 Ko)

Bonjour …

Le Tableau des données (Pays-Villes)étant nommé TB, dans la fenêtre des codes du Fomulaire : premier choix : ComboBox nommé C1, second choix : ComboBox nommé C2 :

Private Sub UserForm_Initialize()
    C1.List = Array("USA", "Canada")
End Sub
Private Sub C1_Change()
    C2 = ""
    If C1.ListIndex = 0 Then C2.List = [TB].Columns(2).Value Else C2.List = [TB].Columns(1).Value
End Sub
Private Sub btnEffacer_Click()
    C1 = "": C2 = "": C1.SetFocus
End Sub
Private Sub btnImprimer_Click()
    'par exemple (imprimer ?)
    MsgBox "Pays : " & C1 & " - " & "Ville : " & C2
End Sub

Merci X cellus et thau, vos solutions marchent parfaitement.

Pour Baroute, j'arrive pas à executer le fichier malgré quelques manipulations (sans doute parce je suis débutant )

Et Ordonc, les pays s'affichent correctement mais quand je clique sur ville, le débogueur m'envoie vers :

Else C2.List = [TB].Columns(1).Value

Sinon merci à tous de m'avoir aidé.

Hello, c'est simple,

Il n'y a pas de macro

Tu as l'onglet "source" dans lequel tu mets tes villes sous tes pays et il y a les deux listes déroulantes dépendantes dans l'onglet "resultat" en A1 et B1

Si tu rajoutes des colonnes dans l'onglet source, cela sera pris automatiquement genre tu rajoutes un pays et des villes en dessous et ce sera répercuté dans tes listes

N'hésite pas si besoin

@+

Rechercher des sujets similaires à "listes deroulantes dependantes cas pays villes"