Liste déroulante filtrée

Bonjour à tous,

Vu que je suis un grand débutant en macros, je sollicite votre aide en macros car j'ai un fichier excel avec 2 onglets "Liste" & "Tableur" sur le premier onglet "Liste" il y'a deux listes déroulantes Joueurs et Caractéristique et dans l'onglet Tableau il y' a un tableau avec des joueurs et des caractéristiques ou des croix ont été mises sur le joueur qui possède la caractéristique au mieux par rapport à ses concurrents.

Je souhaite créer une macro qui me filtre la deuxième liste déroulante en se basant sur les croix X posées dans le tableau si par exemple je choisis un joueur dans la première liste déroulante j'aimerai que la dexième puisse filtrer que sur les caractéristiques qu'il possède automatiquement. Vous trouverez en ci-joint le fichier correspondant à mon explication si vous pouvez m'aider ca serait sans refus Merci beaucoup et bonne journée.

12joueurs.xlsm (13.88 Ko)

Bonjour Dave, bonjour le forum,

Code à placer dans le composant VBA Feuil1(Listes) :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim T As Worksheet 'déclare la variable T (Tableau)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim L As String 'déclare la variable L (Liste)
Dim I As Byte 'déclare la variable I (Incrément)

If Target.Address <> "$B$3" Then Exit Sub 'si le changement a lieu aillerus qu'en B3, sort de la procédure
Target.Offset(0, 2).Delete 'efface la cellule D3
If Target = "" Then Exit Sub 'si B3 est effacé, sort de la procédure
Set T = Worksheets("Tableau") 'définit l'onglet T
Select Case Target.Value 'agit en fonction de la valeur de la cellule cible
    Case "Mbappé" 'cas
        COL = 2 'définit la colonne COL
    Case "Messi" 'cas
        COL = 3 'définit la colonne COL
    Case "Neymar" 'cas
        COL = 4 'définit la colonne COL
    Case "Ronaldo" 'cas
        COL = 5 'définit la colonne COL
End Select 'fin de l'action en fonction de la valeur de la cellule cible
For I = 2 To 9 'boucle  des lignes 2 à 9
    'si la valeur ligne I colonne COL de la boucle vaut X, définit la liste L
    If T.Cells(I, COL) = "X" Then L = IIf(L = "", T.Cells(I, "A"), L & "," & T.Cells(I, "A"))
Next I 'prochaine ligne de la boucle
With Range("D3").Validation 'prend en compte la validation de données en D3
    .Delete 'efface une éventuelle ancienne validation existante
    .Add Type:=xlValidateList, Formula1:=L 'utilise la liste L comme liste de validation de données
End With 'fin de la prise en compte de la validatiojn de données en B3
Target.Offset(0, 2).Select 'sélectionne D3
End Sub

Bonjour,

Merci pour votre réponse. ça fonctionne parfaitement sur cet exemple, néanmoins mon besoin concerne le fichier ci-joint j'ai copié le méme code en adaptant les select case mais ca ne marche pas pour tous les cas et je ne comprends pas pourquoi ? Avez-vous des idées SVP ? Merci, bonne journée.

8test-v1.xlsm (21.13 Ko)

bonjour DAVE

au début de la macro c'est "Private Sub" et non pas "Sub"

a vous relire

Bonjour le fil, bonjour le forum,

Le beug était provoqué quand L était vide (aucune croix dans la colonne). Voici le code modifié qui semble fonctionner :

Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim T As Worksheet 'déclare la variable T (Tableau)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim L As String 'déclare la variable L (Liste)
Dim I As Byte 'déclare la variable I (Incrément)

If Target.Address <> "$B$3" Then Exit Sub 'si le changement a lieu ailleurs qu'en B3, sort de la procédure
Target.Offset(0, 2).Delete 'efface la cellule D3
If Target = "" Then Exit Sub 'si B3 est effacé, sort de la procédure
Set T = Worksheets("Tableau") 'définit l'onglet T
COL = T.Rows(1).Find(Target.Value, , xlValues, xlWhole).Column
For I = 2 To 4 'boucle  des lignes 2 à 4
    'si la valeur ligne I colonne COL de la boucle vaut X, définit la liste L
    If T.Cells(I, COL) = "X" Then L = IIf(L = "", T.Cells(I, "A"), L & "," & T.Cells(I, "A"))
Next I 'prochaine ligne de la boucle
If L = "" Then 'condition : si L est vide
    Target.Offset(0, 2).Value = "Vide !" 'écrit Vide en D3
    Exit Sub 'sort de la procédure
Else 'sinon
    With Range("D3").Validation 'prend en compte la validation de données en D3
        .Delete 'efface une éventuelle ancienne validation existante
        .Add Type:=xlValidateList, Formula1:=L 'utilise la liste L comme liste de validation de données
    End With 'fin de la prise en compte de la validation de données en B3
End If 'fin de la condition
Target.Offset(0, 2).Select 'sélectionne D3
End Sub

Sinon, prends pour habitude de fournir le bon fichier pour éviter de perdre du temps...

@Iliyes : c'est pas faux mais ça marche aussi sans le Private...

merci à toi ThauThème

je prend note, et j'ai modifié cela pour mon propre fichier

cordialement

Bonjour,

Merci pour vos retour, ca fonctionne parfaitement, bonne journée

Bonjour Thauthème, bonjour à tous,

je reprends le fil de ce sujet pour résoudre mon probléme de liste déroulante, variable en nombre de lignes.

Cà ne fonctionne pas en essayant d'adapter votre code

sans titre2
'délimiter liste deroulante
With Sheets("Destination").Range("C6").Validation 'prend en compte la validation de données en C6
    .Delete 'efface une éventuelle ancienne validation existante
    'utilise la colonne I comme liste de validation de données
    .Add Type:=xlValidateList, Formula1:=Sheets("Source").Range("I1" & ":I" & tabdest).Select
End With
7annuaire-tels.xlsm (28.05 Ko)

Merci de votre aide

a+

fronck

Rechercher des sujets similaires à "liste deroulante filtree"