XL 2021 Tableau déroulant

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

jrm

XLDnaute Nouveau
Bonjour,
Je souhaite créer un tableau deroulant avec plusieurs rubriques et sous rubriques.
Les formules fonctionnent sur la ligne 6, en revanche en passant aux lignes suivantes, je n'ai plus les choix (les sous produits proposés sont ceux exploités en ligne 6). Seule la ligne 6 est exploitable comme je souhaite.
Je ne suis peut être pas très clair.
Ci joint le fichier, si vous pouvez m'aider.

Merci
 

Pièces jointes

Bonjour

Base1 doit être une liste, triée de préférence sous forme de tableau structuré sans lignes vides : que font les totaux en bas ?

Attention aussi aux espaces en fin de titres

J'ai nettoyé la base et créer les tableaux utiles via PowerQuery et les formules nommées adaptées pour la validation
 

Pièces jointes

Bonjour

Base1 doit être une liste, triée de préférence sous forme de tableau structuré sans lignes vides : que font les totaux en bas ?

Attention aussi aux espaces en fin de titres

J'ai nettoyé la base et créer les tableaux utiles via PowerQuery et les formules nommées adaptées pour la validation
Bonjour,
merci pour votre retour.
Par contre, quand je sélectionne en ligne 7 un nouveau produit, le sous produit (ligne 7) proposé est en fonction du produit ligne 6.
 
Oups

J'ai oublié de modifié la validation de la colonne sous-produit
1772615040539.png


Si tu modifies la Base, n'oublie pas de la trier puis d'actualiser PowerQuery (Données, Actualiser tout)
 

Pièces jointes

Bonsoir le forum,

Voici une solution VBA avec ces 2 macros dans le code de la feuille :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim T As Range, Auxiliaire As Range, P As Range
Set T = [Tableau189] 'tableau structuré
Set Auxiliaire = Range("K6")
Set Target = ActiveCell
If Intersect(Target, T.Resize(, 3)) Is Nothing Then Exit Sub
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
T.Validation.Delete 'RAZ
Auxiliaire.Resize(Rows.Count - Auxiliaire.Row + 1).Clear 'RAZ
With [BASE1] 'tableau structuré
    .AutoFilter: .AutoFilter 'ôte le filtre
    Set P = Auxiliaire.Resize(.Rows.Count)
    Select Case Target.Column
        Case T.Column
            .Columns(1).Copy P(1)
        Case T(1, 2).Column
            If Target(1, 0) = "" Then Exit Sub
            .AutoFilter 1, Target(1, 0)
            .Columns(2).SpecialCells(xlCellTypeConstants).Copy P(1)
            .AutoFilter
        Case T(1, 3).Column
            If Target(1, -1) = "" Or Target(1, 0) = "" Then Exit Sub
            .AutoFilter 1, Target(1, -1)
            .AutoFilter 2, Target(1, 0)
            .Columns(3).SpecialCells(xlCellTypeConstants).Copy P(1)
            .AutoFilter
    End Select
End With
P.Sort P(1), xlAscending, Header:=xlNo 'tri
P.RemoveDuplicates 1, xlNo 'supprime les doublons
P.Resize(Application.CountA(P)).Name = "Liste" 'nomme la plage
Target.Validation.Add xlValidateList, Formula1:="=Liste" 'crée la liste de validation
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim T As Range, P As Range, tablo1, tablo2, ub&, i&, x$, j&
Set T = [Tableau189] 'tableau structuré
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
'---réinitialise les colonnes de T---
Set P = Intersect(Target, T.Columns(1))
If Not P Is Nothing Then Intersect(P.EntireRow, T.Columns(2).Resize(, 4)).ClearContents
Set P = Intersect(Target, T.Columns(2))
If Not P Is Nothing Then Intersect(P.EntireRow, T.Columns(3).Resize(, 3)).ClearContents
'---remplit les 4ème et 5ème colonnes de T---
tablo1 = T.Resize(, 5) 'matrice, plus rapide
tablo2 = [BASE1] 'tableau structuré
ub = UBound(tablo2)
For i = 1 To UBound(tablo1)
    x = tablo1(i, 1) & tablo1(i, 2) & tablo1(i, 3)
    For j = 1 To ub
        If tablo2(j, 1) & tablo2(j, 2) & tablo2(j, 3) = x Then
            tablo1(i, 4) = tablo2(j, 4)
            If IsNumeric(CStr(tablo2(j, 5))) Then tablo1(i, 5) = CDbl(tablo2(j, 5)) Else tablo1(i, 5) = ""
            Exit For
        End If
Next j, i
T.Columns(4) = Application.Index(tablo1, , 4)
T.Columns(5) = Application.Index(tablo1, , 5)
Application.EnableEvents = True 'réactive les évènements
End Sub
La 1ère macro s'exécute automatiquement quand on sélectionne une cellule des 3 premières colonnes du 1er tableau.

La 2ème macro s'exécute automatiquement quand une cellule quelconque de la feuille est modifiée ou validée.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
XL 2021 planning
Réponses
5
Affichages
392
Réponses
6
Affichages
294
  • Question Question
XL 2019 B
Réponses
10
Affichages
610
Retour