Listes en cascade avec mise en forme tableau
Bonjour à tous,
Je souhaiterais créer des listes en cascade avec une mise en forme tableau.
Tel que vous pouvez le voir dans le fichier Excel ci-joint, j'ai réussi à créer à partir d'une base de données des listes en cascade niveau 7. Mon souci est que les listes en cascade marchent tant que les choix s'opèrent sur la même ligne, i.e.:
Choix1 Choix2 Choix3 Choix4 Choix5 Choix6 Choix7
Or, je souhaiterais pouvoir présenter ses choix sous la forme d'un tableau de la manière suivante:
Choix1
Choix2
Choix3
Choix4
Choix5
Choix6 Choix7 (Choix8)
L'idée sera d'ensuite de créer à l'intersection ligne-colonne une nouvelle liste (Choix8) correspondant à ma donnée issue de la base de donnée.
Je sollicite donc votre aide pour savoir comment je pourrais modifier mon code VBA , adapté du site de M. Boisgontier que je remercie au passage et présenté ci-après ainsi que mon fichier excel ci-joint afin d'avoir cette présentation en tableau.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.ScreenUpdating = False
Set f = Sheets("BD_Geo")
If Not Intersect([A2:A10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:R2], CopyToRange:=f.[J1], Unique:=True
End If
If Not Intersect([B2:B10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -1)
f.[S2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:S2], CopyToRange:=f.[K1], Unique:=True
End If
If Not Intersect([C2:C10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -2)
f.[S2] = Target.Offset(0, -1)
f.[T2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:T2], CopyToRange:=f.[L1], Unique:=True
End If
If Not Intersect([D2:D10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -3)
f.[S2] = Target.Offset(0, -2)
f.[T2] = Target.Offset(0, -1)
f.[U2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:U2], CopyToRange:=f.[M1], Unique:=True
End If
If Not Intersect([E2:E10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -4)
f.[S2] = Target.Offset(0, -3)
f.[T2] = Target.Offset(0, -2)
f.[U2] = Target.Offset(0, -1)
f.[V2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:V2], CopyToRange:=f.[N1], Unique:=True
End If
If Not Intersect([F2:F10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -5)
f.[S2] = Target.Offset(0, -4)
f.[T2] = Target.Offset(0, -3)
f.[U2] = Target.Offset(0, -2)
f.[V2] = Target.Offset(0, -1)
f.[W2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:W2], CopyToRange:=f.[O1], Unique:=True
End If
If Not Intersect([G2:G10000], Target) Is Nothing And Target.Count = 1 Then
f.[R2] = Target.Offset(0, -6)
f.[S2] = Target.Offset(0, -5)
f.[T2] = Target.Offset(0, -4)
f.[U2] = Target.Offset(0, -3)
f.[V2] = Target.Offset(0, -2)
f.[W2] = Target.Offset(0, -1)
f.[X2] = Empty
f.[A1:H10000].AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=f.[R1:X2], CopyToRange:=f.[P1], Unique:=True
End If
End Sub
Je vous remercie par avance pour votre aide,
Cordialement
Sébastien
Bonjour,
Mon souci est que les listes en cascade marchent tant que les choix s'opèrent sur la même ligne
Où as-tu vu ça ?
Tu présentes les choix à faire comme tu l'entends ! Le tout est juste d'affecter la bonne liste de choix en fonction des choix antérieurs.
Cordialement.
Bonjour,
Je vous remercie pour vos réponses.
@MFerrant
Je ne parlais pas des listes en cascade en général mais des listes que j'ai réalisées dans mon fichier Excel. Comme vous me l'avez fait remarquer, je devrais pouvoir arranger mes listes comme je l'entend. Je suppose donc que la référence ligne/colonne dans mon code VBA est erronée et c'est sur ce point que j'aimerais solliciter l'aide de ce forum.
@Ceuzin
Je vous remercie pour le fichier joint. J'ai regardé et en effet, cela me donne effectivement les listes en colonne comme je le voulais cependant les références (target) sont fixées à une cellule. Or, je voudrais pouvoir reproduire mes choix comme ci-après.
Liste1 Liste1 Liste1 Liste1 Liste1
Liste2 Liste2 Liste2 Liste2 Liste2
Liste3 Liste3 Liste3 Liste3 Liste3
Liste4 Liste4 Liste4 Liste4 Liste4
Liste5 Liste5 Liste5 Liste5 Liste5
Liste7 Liste6
Liste7 Liste6
Liste7 Liste6
Liste7 Liste6
L'ordre des listes en cascades est Liste 1, Liste 2, liste 3, etc. jusqu'à 7. Donc si par exemple, la liste 1 est en E7, la liste 2 est en E8, etc. la liste 5 est en E11, la liste 6 est en D11 et la liste 7 en C11.
Je souhaite aussi pouvoir effectuer un nouveau choix dans la liste 1 en F7 m'ouvrant une nouvelle liste 2 en F8. Par exemple, dans mon cas, j'aimerais pouvoir choisir World (E7) World (E8) mais Africa (F7), Eastern Africa (F8).
Je pense que cela pourrait être fait en modifiant le code VBA de mon fichier ou de celui que vous m'avez envoyé mais je ne vois pas comment faire.
Je vous remercie par avance pour votre aide,
Cordialement,
Sébastien
Je crois que j'ai compris ton problème !
Effectivement, tu te rends dépendant des positions de tes cellules de choix, à cause de la macro, celle-ci te faisant la mise à jour des listes en fonction des choix successifs. Si tu changes les dispositions, tu rectifies la macro en conséquence. Le principal problème n'est pas là.
Ce système ne te permet d'alimenter qu'une série de choix. Si tu veux alimenter 5 séries, il faut le multiplier par 5. Dans ces conditions, on peut se demander si le système plus classique d'extraction définitive (hors mise à jour de la base) de toutes les listes de choix possibles, l'affectation de la liste dépendante se faisant alors par formule prélevant la partie de liste nommée en fonction du choix précédent.
Cela alourdirait le poids du classeur, mais peut-être pas plus que multiplier par 5 le système actuel.
Autre solution : abandonner les listes de validation dans des cellules au profit de ComboBox. Là, une fois une liste affectée à un Combo, tu peux l'effacer immédiatement. Pas d'alourdissement du classeur, et tu peux multiplier tes séries. Et plus de dépendance non plus à la position des cellules, tes valeurs proviendront des Combo.
Quel que soit le système, il faut de toutes façons que tu prévoies lors d'un choix, l'effacement des choix dépendants pour le cas où il y en ait eu, et que seul le choix suivant soit alimenté en liste.
Cordialement