Listes dynamiques en cascades
Bonjour,
Bien que parcourant depuis longtemps ce site et son forum pour ses bons conseils, je poste aujourd'hui pour la première fois :
Je poste ici pour avoir une idée sur la faisabilité de mon problème et des moyens à utiliser pour y arriver.
Je m'explique : (je fourni également un fichier simplifié pour développer mes propos, ayant du mal à décrire mon problème)
Afin de simplifier la saisie d'un tableau, un utilisateur va commencer par renseigner une Base de données avec au minimum 4 colonnes la composant.
Les problèmes commencent avec la mise en place du tableau : il faut en effet que je créé des listes dynamiques (car la BDD n'est pas fixe) en fonction d'une première sélection dans le tableau puis une deuxième liste dynamique en fonction à partir de la case précédente (cf fichier joint).
Après de nombreuses recherches j'ai trouvé une solution se rapprochant de mon problème : un fichier réalisé par Jacques BoisGontier et utilisant VBA (voir l'onglet masqué Cascade3Niveaux).
Néanmoins dans ce cas, il n'y a "que" 3 colonnes, alors que dans mon cas il y a les 3 colonnes avec lesquelles mes listes se construiront PLUS des données à extraire selon les éléments sélectionnés (le problème est là).
Voilà donc mes premières questions :
- Y-a-t-il obligation d'utiliser du VBA pour des cascades de ce niveau?
Si oui, que me conseillez comme moyens à utiliser sur VBA ? Méthode citée précédemment, ou existe-il d'autres moyens d'y arriver ?
- Sera-t-il possible de faire une recherche pour aller chercher un prix dans mon fichier ( possibilité de la double recherche V ou via VBA ? )
Ou suis-je obligé de passer par une recherche dans un tableau croisé dynamique que je devrais créer en plus?
Je suis désolé si mes explications manquent de clarté, mon problème étant assez complexe à expliquer, je reste donc à votre disposition pour toute demande de précision.
Cordialement,
OlivierZ
bonjour
un essai
apres avoir trier la bdd par ordre alpha (par genre) voir colonnes masquée puis avoir nommé les colonnes en dynamique
on utilise DECALER pour les listes de validation en tenant compte de la position et du nb de val concernées
cordialement
Bonjour à tous les deux,
j'ai commencé à regarder vos 2 propositions, je reviens vers vous dès que je les ai plus détaillées.
(avec une petite préférence pour la deuxième: je ne connaissais pas le système des matrices, les possibilités offertes sont très intéressantes).
Tulipe-4, merci pour ta proposition qui est très complète et je t'en remercie mais je penses malgré tout me tourner vers le VBA (cela me permet notamment de créer une liste qui va s'agrandir toute seule sans avoir besoin d'étendre tes formules cachées à droite du tableau et le tri automatique est visible par l'utilisateur).
Ta proposition, Ceuzin, se rapproche en effet de celle que j'ai citée dans mon premier message (mais en plus simple et surtout avec des listes qui s'adaptent immédiatement sans avoir besoin de re-sélectionner les choix dans les listes : un grand merci pour cette possibilité de simplification).
Néanmoins j'y retrouve le même problème avec lequel je me suis débattu en essayant d'adapter la première méthode : les colonnes de droites (prix et d'autres que je voudrais rajouter) ne suivent pas lorsque le tri alphabétique automatique se fait.
Macro concernée :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect([A4:C1000], Target) Is Nothing And Target.Count = 1 Then
[A4:C1000].Sort Key1:=[A2], Key2:=[B2], Key3:=[C2]
[A3:C1000].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[G3], Unique:=True
[A3:C1000].AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[I3:J3], Unique:=True
End If
End SubMême en modifiant la cible de la macro ([A4:C1000]) en modifiant le C par D, E ou autre et en modifiant en conséquence les formules suivantes, la macro bug sur la ligne annonçant les "Key" (c'est l'ajout de Key4, etc qui ne semble pas être reconnu par VBA).
Est-il impossible de mettre plus de 3 variantes avec Range.Méthode Sort ? (cf aide sous excel)
à la place de
[A4:C1000].Sort Key1:=[A2], Key2:=[B2], Key3:=[C2]Je pensais utiliser quelque chose comme :
ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("BDD").Sort.SortFields.Add Key:=Range("A4"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("BDD").Sort
.SetRange Range("A4:D1000")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With(faite en partie à partir de l'enregistreur)
Le problème est qu'elle ne tri que par rapport à la première ligne et pas la deuxième dans un second temps (contrairement au Range.Méthode Sort )
Autre solution peut-être, grâce à l'enregistreur et le système de filtre : filtrer la colonne C, puis la B, puis A, et enlever le filtre (à faire dès qu'une modification est apportée, donc assez lourd).
bojour
je ne suis pas un grand specialiste mais je crois qu'en utilisant le nom de cette plage qui aura ete nomé en dynamique au prealable comme pour des formules , cela devrait etre un bon compromis
pour en revenir a ma proposition
le tableau bd est dynamique ; le tri ne l'est pas mais si tu incermente en prevoyant large cela fera ,tout le reste est dynamique
par contre il y a un truc qui me chiffonne ;c'est l'utilisation car pour un type ;il peut y avoir plusieurs reponses qui seront fatalement redondantes dans l'extraction des sous listes ;ce qui fait que tu risques assez rapidement ,de te retrouver avec des listes a rallonge tartinées de doublons ; une liste de 15 val c'est digeste mais 50 avec 10fois les memes ;ça l'est moins alors ; un tri sans doublon de cette matrice classeé par genre ne serait eventuellement pas du luxe
et peut etre meme demarrer d'un tableau pre etabli ;dans ce cas quid de la saisie manuelle
cordialement
En définitive, j'ai utilisé l'enregistreur de macros et effectué 3 tris consécutifs sur les 3 premières colonnes (de droite à gauche) afin d'obtenir un tri prenant en compte les nombreuses autres colonnes de mon tableau.
Bonjour,
Procédure de tri sur x colonnes simplifiée..
Sub Trie4Colonnes()
Dim DerLig As Long
DerLig = Sheets("BDD").Range("A" & Rows.Count).End(xlUp).Row
With Sheets("BDD").Sort
With .SortFields
.Clear
.Add Key:=Range("A4:A" & DerLig), Order:=xlAscending
.Add Key:=Range("B4:B" & DerLig), Order:=xlAscending
.Add Key:=Range("C4:C" & DerLig), Order:=xlAscending
.Add Key:=Range("D4:D" & DerLig), Order:=xlAscending
'.Add Key:=Range("E4:E" & DerLig), Order:=xlAscending 'Etc....
End With
.SetRange Range("A4:D" & DerLig)
.Header = xlNo 'Titre non compris dans la plage de tri
'.MatchCase = True 'Pour respecter la case (Maju/Minus)
.Orientation = xlTopToBottom
'.SortMethod = xlPinYin 'Uniquement pour le chinois
.Apply
End With
End SubSi ajout/suppression de clé pas oublier d'adapter SetRange
Pour ton problème de liste, ça pourrait pas être avec un UserForm et des combobox ?
A+