Afficher une liste déroulante selon le choix d'un ComboBox

Bonjour,

J'essaie de mettre en place un fichier excel pour une collection de jeu de carte. Je souhaiterai qu'en fonction de choix dans un combobox (l'utilisateur choisie une année), la liste située en dessous dans le userform s'adapte pour afficher la liste des cartes de cette année. Je dispose d'une feuille avec l'ensemble des années (toutes sur la ligne ). Une fois le choix de l'année fait j'essaie de coder en vba la recherche de la valeur de la sélection du combobox dans le tableau. Une fois que la correspondance est trouvée, la liste affiche les cases de la ligne juste en dessous de celle de l'année jusqu'à la première ligne vide. (pour limiter la liste au nombre de cartes).

Je pensais y arriver en cherchant un peu mais je bloque totalement. J'ai repris d'anciens projets avec une situation quasiment identique mais rien à faire..

Voici mon code :

Private Sub ComboBox1_Change()
Dim i, j, colonne_carte As Integer
j = 2

UserForm1.LISTCARTES.Clear

Sheets("CARTES").Activate

Do While Cells(1, j).Value <> ""

If Cells(1, j).Value = ComboBox1.Value Then
Cells(1, j).Select
ActiveCell.Interior.ColorIndex = 32
colonne_carte = ActiveCell.Column


End If
j = j + 9
Loop


i = 2
Do Until IsEmpty(Worksheets("CARTES").Cells(i, colonne_carte))
Call Me.LISTCARTES.AddItem
Worksheets("CARTES").Cells(i, colonne_carte).Value
i = i + 1
Loop

End Sub

L'erreur arrive au niveau du UntilIsEmpty... Je ne pense pas que ce soit le fonction adéquat. Mais le comptage de la première ligne non vide par les codes trouvés sur internet ne donnent rien pour l'instant.

Un petit peu d'aide ne serait pas de refus :)

A bientôt

Petite rectification. J'ai modifié légèrement le code au niveau de la boucle Do While. Cette fois-ci l'erreur arrive au niveaux Whorkshetts("CARTES")... dans l'initialisation De le LISTCARTES.

Je ne sais pas si le boucle For.. est meilleure dans ce cas.

Private Sub ComboBox1_Change()
Dim i, j, colonne_carte As Integer
'j = 2

UserForm1.LISTCARTES.Clear

Sheets("CARTES").Activate

' Do While Cells(1, j).Value <> ""
For j = 2 To 1000 Step 9
If Cells(1, j).Value = ComboBox1.Value Then
Cells(1, j).Select
ActiveCell.Interior.ColorIndex = 32
colonne_carte = ActiveCell.Column
End If



Next



i = 2
Do Until IsEmpty(Worksheets("CARTES").Cells(i, colonne_carte))
Call Me.LISTCARTES.AddItem
Worksheets("CARTES").Cells(i, colonne_carte).Value
i = i + 1
Loop

End Sub

Bonjour Pop, bonjour le forum,

Essaie comme ça. Non testé car tu n'as pas daigné fournir un petit exemple...

Private Sub ComboBox1_Change()
Dim OC As Worksheet 'déclare la variable OC (Onglet Cartes)
Dim R As Range 'déclare la variable R (Recherche)
Dim C As Integer 'déclare la variable C (Colonne)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

Set OC = Worksheets("CARTES") 'définit l'onglet OC
If Me.ComboBox1.Value = "" Then Exit Sub 'si la ComboBox1 est vide, sort de la procédure
listcartes.Clear 'vide la listbox
'définit la recherche R (recherche la valeur entière de la ComboBox1 dans la ligne 1 de l'onglet OC)
Set R = OC.Rows(1).Find(Me.ComboBox1.Value, , xlValues, xlWhole)
If Not R Is Nothing Then 'condition : s'il existe au moins une occurrence trouvée
    R.Interior.Color = 32 'colore la première occurrence trouvée
    C = R.Column 'définit la colonne C
    DL = OC.Cells(Application.Rows.Count, C).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne C de l'onglet OC
    Me.listcartes.List = OC.Range(OC.Cells(2, C), OC.Cells(DL, C)).Value 'alimente la ListBox
End If 'fin de la condition
End Sub

Bonjour, Merci de votre réponse.

Voici mon fichier su lequel je travail. J'y ai intégré le code. Première bonne nouvelle, je peux changer les choix dans le combobox sans faire planter le tout. Cependant pas d'affichage de la liste de cartes. J'essaie encore de comprendre certaines ligne de votre code.

Merci à vous

Re,

D'abord, il te faut remplacer la ComboBox LISTCARTES par une ListBox (que tu renommeras aussi LISTCARTES).

Ensuite, il faut que les noms dans la plage B515:B588 soient strictement identiques avec les noms qu'il y a dans la ligne 1. Pas BASE SET II dans la liste et #BASE SET 2 dans la ligne 1...

Après ça devrait aller mieux...

Je n'avais mis que les premiers nom sans les # pour tester. Et maintenant tout fonctionne à merveille merci beaucoup!

Petite mise à jour. J'ai vu de très bons tutos pour afficher plusieurs colonne d'un même tableau dans une liste du UserForm. Cependant il fallait que les colonnes du tableaux soient fixe ( ou tableau unique) ce qui n'est pas le cas pour mon fichier. Dans la même liste ("LISTCARTES") est-il possible de faire ceci en VBA? C'est à dire afficher trois colonnes du tableau sur lequel le choix de l'année nous renvoi.

Merci encore pour tout

Re,

Renvoie ton fichier modifié avec les bons noms et la ListBox... Au moins on pourra tester !

Le voici. J'ai agrandi la liste pour que ce soit lisible. Il me manque donc à renseigner les deux autres colonnes. J'ai essayer quelsues trus mais rien de concluant en essayant d'ajouter deux lignes à votre code pour dire d'afficher ce dont j'ai besoin.

Mais rien à faire. Je reste un peu perdu..

Re,

Le nouveau code de la ComboBox1 :

Private Sub ComboBox1_Change()
Dim OC As Worksheet 'déclare la variable OC (Onglet Cartes)
Dim R As Range 'déclare la variable R (Recherche)
Dim C As Integer 'déclare la variable C (Colonne)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)

Set OC = Worksheets("CARTES") 'définit l'onglet OC
If Me.ComboBox1.Value = "" Then Exit Sub 'si la ComboBox1 est vide, sort de la procédure
LISTCARTES.Clear 'vide la listbox
'définit la recherche R (recherche la valeur entière de la ComboBox1 dans la ligne 1 de l'onglet OC)
Set R = OC.Rows(1).Find(Me.ComboBox1.Value, , xlValues, xlWhole)
If Not R Is Nothing Then 'condition : s'il existe au moins une occurrence trouvée
    R.Interior.Color = 32 'colore la première occurrence trouvée
    C = R.Column 'définit la colonne C
    DL = OC.Cells(Application.Rows.Count, C).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne C de l'onglet OC
    Me.LISTCARTES.List = OC.Range(OC.Cells(2, C), OC.Cells(DL, C + 2)).Value 'alimente la ListBox <=== c'est ici que ça change
End If 'fin de la condition
End Sub

Remarque : Tu peux laisser la propriété BoundColumn = 1 pour la listbox LISTCARTES.

Incroyable!! Tout fonctionne à merveille. Ca à l'air si simple quand je vois la différence entre les deux code mais bon je dois travailler un peu plus ^^.

En tout cas merci beaucoup d'avoir pris le temps pour me répondre.

Bonne fin de journée à vous

Rechercher des sujets similaires à "afficher liste deroulante choix combobox"