Menu déroulant - cascade

Bonjour à tous,

Mon problème est simple à expliquer mais je ne trouve pas de solution pour le résoudre:

J'ai plusieurs menus déroulants les uns à côté des autres. Je souhaiterai que lorsque je sélectionne une valeur dans le premier (à gauche), le menu suivant (celui juste à sa droite donc) me propose que certaine valeurs en fonction de ce que j'ai sélectionné dans le premier menu.

Pour l'exemple que je vous propose:

Mon premier menu doit sélectionner le Type, donc par exemple je prend "Stylo", et le deuxième menu la couleur. Sauf qu'il n'y a pas toutes les couleurs pour le type "Stylo", j'aimerai par exemple qu'en sélectionnant "Stylo", j'ai dans mon menu déroulant Couleur les valeurs "rouge", "vert" et "Orange" qui apparaissent et non toutes les valeurs. Même idée pour le menu 3: si je sélectionne "Stylo" puis "rouge" j'aurai que certaine valeurs de disponible et non toutes les valeurs.

14exempleforum.xlsx (8.72 Ko)

Autres petite question: comment faire pour que le premier choix disponible soit sélectionné comme valeur par défaut.

En vous remerciant

Bonjour,

Tu commences par faire une base de données avec toutes les combinaisons existantes de tes 3 caractéristiques (chacune dans une colonne).

Exemple :

Stylo - Rouge - Petit

Stylo - Rouge - Moyen

Stylo - Rouge - Grand

Stylo - Noir - Très petit

Stylo - Noir - Petit

Crayon - Rouge - Très petit

etc.

A partir de cette base triée, on pourra établir les listes de validation...

Cordialement.

Bonjour, ma demande est encore plus simple que ça: je ne veux pas que vous me fassiez le travail, je veux que vous me montriez comment le faire, car j'ai 10 à 15 colonnes différentes avec beaucoup de données dans chacune.

Là l'exemple que je vous ai donné est avec très peu de données, je veux juste que vous me montriez comment je dois procéder pour faire ces "listes de validations", en d'autres mots: faites moi ce que j'ai donné dans l'exemple pour le Stylo, juste le fait que quand je choisie "Stylo", j'ai que 3 valeurs qui peuvent être choisie pour la suite.

Pas besoin de tout me faire ^^

Pour faire encore plus simple, je vous ai réduit les données et je vais vous donner les listes de combinaisons:

Stylo-rouge-petit

Stylo-rouge-moyen

Stylo-noir-petit

Crayon-vert-très petit

Crayon-vert-petit

Plume-rouge-petit

Plume-noir-petit

Plume-noir-moyen

Plume-vert-très petit

Plume-vert-moyen

Voilà, faite comme vous le voulez mais ne vous prenez pas la tête à tout faire, si jamais vous pouvez m'expliquer en n'en faisant qu'un seul ce sera bon

Merci.

11exempleforum2.xlsx (8.57 Ko)

Plop, pas de solutions?

Bonjour,

Figure-toi que si tu me fournis un fichier comportant ta base organisée telle que je l'ai indiquée (et que tu reproduisais dans ton dernier post, il me faudra pour t'illustrer le traitement, faire les extractions de listes de cette base pour fournir les listes aux menus déroulants... Si en plus je dois monter la base ! ... je n'ai pas assez de temps à consacrer à l'ensemble.

En outre, on répète assez souvent que les demandeurs doivent éviter de demander une solution sur un modèle simplifié par rapport à leur configuration car, dans quasiment tous les cas, ils ne seront pas en mesure d'adapter la réponse à leur configuration, ce qui a pour conséquence que l'intervenant refait la chose deux fois, voire trois !

Alors quand tu parles de 16 colonnes alors que tu en montres 3, on a largement toutes les chances d'être sûr qu'on va se trouver dans un tel cas !

Cordialement.

Bonjour, j'ai même pas fini les 6 premières colonnes de ma base de données, donc je les fini et je te donne ça

Les autres colonnes je le ferai mais que beaucoup plus tard, j'aimerai déjà voir ce que ça donne avec mes 6 première colonnes

Je t'envoi ça dès que j'ai fini

OK !

Voilà finalement ce sera 5 colonnes je me suis trop pris la tête à écrire et copier la même chose je ferai le reste après!

Merci

Bonsoir,

Je ne vois pas les emplacements des menus déroulants...

Pour confirmer les "cascades" :

1er choix sur 1re colonne

2e choix dépendant choix 1 (sur 2e colonne)

3e choix dépendant choix 1 et choix 2 (sur 3e colonne)

4e choix dépendant choix 1, 2 et 3 (sur 4e colonne)

Les 4 choix impliquent une seule valeur 5e colonne (pas de choix).

Cordialement.

Bonjour, l'emplacement des menus déroulants vous pouvez les mettre où bon vous semble

Oui en effet c'est comme vous le dites:

choix 1: colonne 1;

choix 2: dépend du choix 1;

choix 3: dépend du choix 2;

choix 4: dépend du choix 3;

choix 5: en effet il n'y a qu'une seule valeur qui dépendra des choix précédents.

Merci ^^

Bonjour,

Il faudra veiller à ne pas introduire d'espaces parasites dans les données...

Voilà une des façons élémentaires de mettre en place des listes cascades :

J'ai nommé la feuille où figurent les données Data, et nommé la base (nom dynamique) : le nom Base est défini par la formule :

=DECALER(Data!$A$1;;;NBVAL(Data!$A:$A);NBVAL(Data!$1:$1))

Le nom couvre toute la base, en-tête incluse, et suivra les extensions de cette dernière en lignes et en colonnes.

Ajout d'une feuille Liste, sur laquelle on va extraire des listes de la base.

Les extractions vont se faire par filtrage avancé des parties concernées de Base :

  • Les éléments uniques de la colonne Nom extraits vers Liste!A1
  • Les éléments uniques des colonnes Nom et Type extraits vers Liste!C1:D1
  • Les éléments uniques des colonnes Nom, Type et Dimension extraits vers Liste!F1:H1
On a nommé (en dynamique, à partir de la ligne 2) :
  • la 1re extraction : LstNom
  • la 1re colonne de la 2e extraction : LstNT
  • la 1re colonne de la 3e extraction : LstNTD

Ces extractions sont réalisées au moyen d'une proc. VBA (car nettement plus simple que manuellement !), lancée par un bouton de mise à jour à utiliser lorsque l'on a apporté des modifications à la base.

La proc. efface les anciennes listes, réalise un tri de la Base et opère les extractions des nouvelles listes.

Sub MajListes()
    Dim wsL As Worksheet
    Set wsL = Worksheets("Liste")
    [LstNom].ClearContents
    [LstNT].Resize(, 2).ClearContents
    [LstNTD].Resize(, 3).ClearContents
    With [Base]
        .Sort key1:=.Cells(1, 4), order1:=xlAscending, Header:=xlYes
        .Sort key1:=.Cells(1, 1), order1:=xlAscending, key2:=.Cells(1, 2), _
         order2:=xlAscending, key3:=.Cells(1, 3), order3:=xlAscending, Header:=xlYes
        .Resize(, 1).AdvancedFilter xlFilterCopy, , wsL.Range("A1"), True
        .Resize(, 2).AdvancedFilter xlFilterCopy, , wsL.Range("C1:D1"), True
        .Resize(, 3).AdvancedFilter xlFilterCopy, , wsL.Range("F1:H1"), True
    End With
End Sub

Mise en place des listes déroulantes (formules de validation) :

(Réalisé sur Feuil1...)

-Choix 1 opéré en D5 : la formule de validation : =LstNom (c'est en effet cette liste qui contient les choix de 1er niveau)

-Choix 2 opéré en F5 : la formule de validation va rechercher dans la liste LstNT le choix 1 opéré en D5 et renvoyer une liste décalée en ligne sur le range de D5 dans la liste et en colonne sur la colonne voisine, et dimensionnée sur le nombre de valeurs égales à D5 dans la liste :

=DECALER(LstNT;EQUIV($D5;LstNT;0)-1;1;NB.SI(LstNT;$D5))

-Choix 3 opéré en H5 : dépend des choix en D5 et F5, le principe est le même, on opère sur la 3e extraction mais on recherche le rang de la correspondance des choix en D5 et F5 dans les deux premières colonnes (analyser la formule...) :

=DECALER(LstNTD;EQUIV(1;(LstNTD=$D5)*(DECALER(LstNTD;;1)=$F5);0)-1;2;SOMMEPROD((LstNTD=$D5)*(DECALER(LstNTD;;1)=$F5)))

-Choix 4 opéré en J5 : dépend des choix en D5, F5 et H5, même méthode que précédemment, mais on recherche la correspondance sur 3 colonnes et (l'on n'a pas fait d'extraction, s'agissant du dernier choix dépendant) on opère directement sur la Base (voir formule ) :

=DECALER(Base;EQUIV(1;(DECALER(Base;;;;1)=$D5)*(DECALER(Base;;1;;1)=$F5)*(DECALER(Base;;2;;1)=$H5);0)-1;3;SOMMEPROD((DECALER(Base;;;;1)=$D5)*(DECALER(Base;;1;;1)=$F5)*(DECALER(Base;;2;;1)=$H5));1)

-Le dernier élément dépendant des 4 choix précédent, et étant unique, est recherché dans la Base au moyen d'une formule placée dans la cellule (L5) :

=SIERREUR(INDEX(DECALER(Base;;4;;1);EQUIV(1;(DECALER(Base;;;;1)=$D5)*(DECALER(Base;;1;;1)=$F5)*(DECALER(Base;;2;;1)=$H5)*(DECALER(Base;;3;;1)=$J5);0));"")

Formule matricielle (valider par Ctrl+Maj+Entrée)

Les changements opérés dans tel ou tel choix ne modifient les choix dépendants faits sur une autre valeur, il convient donc en cas de changements de les effacer, ce que l'on fait au moyen d'une procédure évènementielle qui réagit au changement dans l'une des cellules de choix 1, 2 ou 3 et efface tous les choix dépendants du choix modifié...

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Me.Range("D5,F5,H5")) Is Nothing Then
        Application.EnableEvents = False
        Select Case Target.Address
            Case "$D$5": Me.Range("F5,H5,J5").ClearContents
            Case "$F$5": Me.Range("H5,J5").ClearContents
            Case "$H$5": Me.Range("J5").ClearContents
        End Select
        Application.EnableEvents = True
    End If
End Sub

Cordialement.

Bonjour

Bonjour MFerrand

Mon test

bonjour

une contribution tardive ( quel binz ce tablo ;;;des espaces +.........) ce qui rend le tri sans double bien merdique ; mais en s'acharnant ...

cordialement

reste a faire la reinitialisation en vba

cordialement

14mave2.xlsx (23.26 Ko)

Un grand merci, j'ai pas tout saisie car j'ai rapidement lu en diagonal le fonctionnement mais je l'ai surtout testé, sa marche bien je vous remercie beaucoup

Je reviendrai vers vous si j'ai des questions

Je valide le sujet!

ENCORE MERCI!!!

Rechercher des sujets similaires à "menu deroulant cascade"