Liste déroulante en cascade 5 niveaux

Bonjour,

Après avoir essayé toute la journée, je n'ai pas réussi à créer une liste déroulante en cascade à partir de ces cinq critères en entrée : domaine, catégorie, type, sous-type, dimensions. En choisissant les cinq critères sur la feuille 2, j'aimerais avoir en sortie le prix et la main d'oeuvre nécessaire.

Je suis un peu désespéré parce que je suis allé sur ce site très complet (http://boisgontierjacques.free.fr/pages_site/listes_cascade.htm), mais je n'arrive pas à adapter les formules à mon Excel (également en pièce jointe).

Je vous remercie pour votre aide.

Pams

158test-cascade.xlsx (21.65 Ko)

Bonjour,

un essai

j'ai adapté un de mes fichiers en espérant me rapprocher le plus de ton besoin

on peut donc partir de là et améliorer si besoin

360test-cascade.xlsm (38.02 Ko)

Bonjour,

Une piste. Liste de choix sur 6 niveaux avec inscription de MO et du prix :

252test-cascade.xlsm (33.08 Ko)

Bonjour

simple utilisateur, mais pour ça j'aime bien les segments, t es mis aussi le principe des listes déroulantes en cascade

Bonne continuation

Bonsoir,

Dim zSaisie, NbNiv
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set zSaisie = Range("B2:F10")
    NbNiv = 5
    If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
      TblBD = [Tableau1].Value
      Set d1 = CreateObject("Scripting.Dictionary")
      nivCourant = Target.Column - zSaisie.Column + 1
      Dim Tmp(): ReDim Tmp(1 To nivCourant)
      For k = 1 To nivCourant - 1
        Tmp(k) = Target.Offset(, -(nivCourant - k))
      Next k
      For i = 1 To UBound(TblBD)
         témoin = True
         For k = 1 To nivCourant - 1
            If TblBD(i, k) <> Tmp(k) Then témoin = False: Exit For
         Next k
         If témoin Then d1(TblBD(i, nivCourant)) = ""
       Next i
       If d1.Count > 0 Then
           temp = Join(d1.keys, ",")
           Target.Validation.Delete
           If temp <> "" Then Target.Validation.Add xlValidateList, Formula1:=temp
        End If
    End If
 End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(zSaisie, Target) Is Nothing And Target.Count = 1 Then
         nivCourant = Target.Column - zSaisie.Column + 1
         If nivCourant < NbNiv Then
           Application.EnableEvents = False
           Target.Offset(, 1).Resize(, NbNiv - nivCourant).Validation.Delete
           Target.Offset(, 1).Resize(, NbNiv - nivCourant) = ""
           Application.EnableEvents = True
         End If
     End If
End Sub

Boisgontier

simple utilisateur, mais pour ça j'aime bien les segments,

excellente idée, pas de macro ... !

Bonjour,

simple utilisateur, mais pour ça j'aime bien les segments, t es mis aussi le principe des listes déroulantes en cascade

Bonne continuation

Très bien mais ne fonctionne pas sous Excel 2007 et antérieur !

Bonjour à tous,

J'ai amélioré un poil ma proposition

Const nbZones = 8

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim data() As Variant
Dim choix() As Variant
Dim dico As Object
Dim i&, iData&, iZone&

    On Error GoTo fin
    If Target.Count <> 1 Then Exit Sub
    On Error GoTo 0

    ReDim choix(1 To nbZones)
    For i = 1 To nbZones
        choix(i) = Range("zone" & i).Value
        If Not Intersect(Range("zone" & i), Target) Is Nothing Then
            data = [TabData].Value
            Set dico = CreateObject("Scripting.Dictionary")
            For iData = 1 To UBound(data)
                flag = True
                If i > 1 Then
                    For iZone = 1 To i - 1
                        If choix(iZone) <> CStr(data(iData, iZone)) Then flag = False
                    Next
                End If
                If flag Then dico(CStr(data(iData, i))) = ""
            Next iData
            If dico.Count > 0 Then
                Target.Validation.Delete
                Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")
            End If
            Filtrer
            Exit For
        End If
    Next i

fin:
    Exit Sub
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    For i = 1 To nbZones
        If Not Intersect(Range("zone" & i), Target) Is Nothing Then
            If i < nbZones Then
                Application.EnableEvents = False
                For iZone = i + 1 To nbZones
                    With Range("zone" & iZone)
                        .Value = ""
                        .Validation.Delete
                    End With
                Next
                Application.EnableEvents = True
            End If
            Filtrer
            Exit For
        End If
    Next
End Sub

Private Sub Worksheet_Activate()
    Filtrer
End Sub

Private Sub Filtrer()
    Sheets("BdD").Range("TabData[#All]").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("A3").CurrentRegion, CopyToRange:=Range("A7").CurrentRegion.Resize(1), Unique:=False
End Sub

Bonjour,

Merci à tous pour vos réponses, ça me fait vraiment très plaisir.

Steelson, ta propostion correspond très bien à mes attentes; et même plus que ça, elle les dépasse.

Le seul problème que j'ai repéré c'est que le numéro (colonne E) ne doit pas être un critère de sélection. Est-il possible de le retirer ? Cela laisserait donc le domaine, la catégorie, le type, le sous-type et les dimensions comme critères.

Merci infiniment à tous encore une fois.

Est-ce qu'il est possible d'inverser les colonnes dans ce cas (ce qui serait plus logique pour moi), sinon il faudrait que je bidouille le code et cela sortirait de mon "standard" ?

Exemple avec inversion des colonnes N° et Dimensions

Je suis en train de finir de constituer la base de données, et c'est plus pratique pour moi de la garder comme ça.

Mais une fois terminée, je pourrai certainement coller mon nouveau tableau dans le fichier que tu viens d'upload, en veillant à inverser les colonnes.

Autre question, est-il possible de faire appel à la recherche dans un autre classeur ?

Mon but final serait de pouvoir faire appel à la recheche à n'importe quel moment dans un classeur, et que celle-ci affiche directement la MO et le prix.

Par exemple, regrouper le prix de 4 équipements dans un tableau

Cellule A1 : en-tête du tableau = "Chiffrage robinetterie"

De A2 à E2, possibilité de sélectionner le domaine, la catégorie, le type, le sous-type et les dimensions du premier équipement. En F2 s'afficherait la MO, en G2 le prix après sélection de l'équipement. Ensuite en rentrant en H2 le nombre d'unités, on peut avoir en I2 le prix total de (nombre d'unités H2 * Prix G2).

Et ainsi de suite pour les autres équipements, et autant de fois que nécessaire.

Autre question, est-il possible de faire appel à la recherche dans un autre classeur ?

Mon but final serait de pouvoir faire appel à la recheche à n'importe quel moment dans un classeur, et que celle-ci affiche directement la MO et le prix.

Par exemple, regrouper le prix de 4 équipements dans un tableau

Je ne suis pas sûr de bien comprendre, peux-tu faire une maquette du résultat attendu ?

Bonjour,

J'aimerais si possible rajouter une colonne pour pouvoir différencier les postes concernés. Désolé d'abuser de ta patience

Je te joins aussi une maquette de ce que j'aimerais avoir dans un second temps. J'aimerais pouvoir l'utiliser dans un fichier qui existe déjà.

39chiffrage.xlsm (93.47 Ko)
38maquette.xlsx (13.65 Ko)

ok

Cela veut dire que le choix

Poste Domaine Catégorie Type Sous-type Dimensions

étant fait il n'y a qu'une seule possibilité ?

Bonjour

A tester ... et améliorer si besoin !

73chauffage.xlsm (85.85 Ko)

Bonjour,

Merci, ça marche très bien mais j'aurais deux remarques :

1) J'aimerais également garder l'idée de départ qui est d'avoir un tableau listant tous les équipements au fur et à mesure que l'on sélectionne les critères. Comme tu l'avais fait au début mais avec six listes déroulantes.

2)

1) J'aimerais également garder l'idée de départ qui est d'avoir un tableau listant tous les équipements au fur et à mesure que l'on sélectionne les critères. Comme tu l'avais fait au début mais avec six listes déroulantes.

2) Dans ton dernier fichier, il faudrait enlever le numéro des données affichées par le code. ligne, à chaque fois que l'on clique dessus

ok, dans ce cas une fois la liste réduite à 1 item, je le déverserai dans un tableau pour pouvoir passr à un nouvel item

Est-ce qu'il possible de faire appel à ce code dans un fichier séparé via une macro ? Dans l'idéal, j'aimerais un bouton qui permet d'afficher les six listes déroulantes de critère + les deux cellules de sortie sur une seule ligne, à chaque fois que l'on clique dessus

ok je regarde cela aussi ce soir ou demain matin

Bonjour,

pour le point 1 .... j'ai un peu perdu le fil du sujet donc n'hésite pas à me demander des modifications

50chauffage-v1.xlsm (39.98 Ko)

je regarderai ensuite le point 2 comment faire !

Oui, je comprends que tu perdes le fil

Le fichier de base n'est pas le bon du coup, parce que je demandais 6 listes déroulantes (ajout de la colonne "poste"). Je te remets le bon. Aussi, pour faciliter la lecture du tableau de sortie, j'aimerais que la hauteur des lignes reste "normale"

Sinon ce que tu as fait, c'est exactement ce que je veux pour le point 1, mais avec 6 listes déroulantes.

Merci

28chiffrage.xlsm (93.47 Ko)

Voici

N'hésite pas pour la suite si nécessaire ... (je reviendrai en fin d'apm)

133chiffrage.xlsm (103.11 Ko)
Rechercher des sujets similaires à "liste deroulante cascade niveaux"