XL 2019 ListBox liées

Pirlouit85

XLDnaute Nouveau
Bonjour,
J'ai 5 listbox avec plusieurs choix possibles dans chacune.
Quand je sélectionne des items dans une listbox, toutes les autres listbox doivent s'actualiser en fonction du choix précédent et ainsi de suite.
Ex : je sélectionne un domaine ds une listbox et seules les fonctions de ce domaine s'affichent dans la seconde et seules les classes de ce domaine s'affichent dans la 3ème etc.
Et je peux commencer par n'importe quelle listbox.
Toutes les listbox proviennent de champs d'une même BDD qui sont initialisées au démarrage du formulaire.

En résumé, j'aimerais reproduire dans un formulaire ce que l'on peut faire avec Données Filtrer

J'ai fait le formulaire et les listbox initialisées mais c'est ensuite que ça se complique...
Si vous avez déjà fait ce genre de choses, je suis preneur.
Merci à tous !
 

Pirlouit85

XLDnaute Nouveau
Oui vous avez raison.
Ci-joint mon fichier exemple.
Dans le formulaire je n'ai fait que 3 listbox pour l'instant sachant que j'en aurai d'autres ensuite à ajouter...
Donc pour résumer, si je choisis Administrateur ou administratrice 1 et chef ou cheffe de service 3, seules les classes N et S doivent s'afficher dans la listBox classes et si ensuite je choisi la classe S, seul le Cg 7 reste affiché. Sachant que je peux commencer par le Cg : Si Cg 6 choisi seules les classes K et L (et Responsable encadrement intermédiaire 3 et 4) puis je choisis Responsable encadrement intermédiaire 3 alors reste Cg 7).
Il faudrait que ça fonctionne dans n'importe quel ordre comme Données Filtrer. J'ai pour l'instant du mal à voir solution ...
Merci
 

Pièces jointes

  • catalogue.xlsm
    40 KB · Affichages: 12

Dranreb

XLDnaute Barbatruc
Bonjour.
Il y a une fourniture qui fait exactement ça automatiquement, mais pour des ComboBox seulement. Elle ne prend pas en charge les ListBox, mais ne nécessite aucune programmation pour la recherche hormis, dans la Sub UserForm_Initialize, des spécification à une méthode Add des ComboBox concernées et des colonnes auxquelles elles correspondent dans le tableau à consulter, voire mettre à jour. Pas besoin de tables annexes pour les listes, elles sont construite automatiquement d'après ce qui existe dans cette base et ce qui a déjà été sélectionné dans certaines.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
S'il y a une bonne raison de préférer des ListBox, peut être, mais je n'en ai jamais vu jusqu'à présent. Sauf éventuellement si elle sont à sélections multiples, car une ComboBox ne peut afficher qu'une seule valeur retenue. Il y a une procédure dans la ressource permettant d'extraire les numéros de lignes correspondant aux sélections multiples d'une ListBox, mais mon objet ComboBoxLiées ne l'utilise pas. Cherchez un peu dans TÉLÉCHARGEMENTS. Le classeur proposé est un précurseur qui s'installe en .xlam. Mais sont intérêt est surtout une page d'aide, car le plus souvent, ces dernier temps j'équipe plutôt les classeurs utilisateurs intéressés des modules de services nécessaires.
 

Dranreb

XLDnaute Barbatruc
Ah oui c'est vrai vous l'aviez dit dans votre 1ère phrase. Mais après, vous enchainez avec des exemples à une seule sélection. Vous auriez du dire Ex : je sélectionne certains domaines ds une ListBox et seules les fonctions d'au moins l'un d'entre eux etc.
C'est juste visuel ? Je ne comprend pas trop ce que vous voulez dégager avec tout ça …
Je pense que le module standard central de service MSujetCBx a toutes les pièces pour gérer ça, à commencer par la fonction SujetCBx pour fabriquer un Sujet pour chaque ListBox. Techniquement ce n'est par un objet mais un Array à 2 éléments, le 0 et le 1. Le 0 peut s'affecter aux List des ListBox, Le 1 contient les listes de numéros de lignes dans la base portant chaque valeur de la liste. Des Fonctions TLgnLBx et SujCBxFiltré seront bien utiles aussi. Autre chose: il serait bon que la base soit sous forme de tableau.
 

Pirlouit85

XLDnaute Nouveau
C’est pour gagner du temps dans la sélection : je sélectionne 2 ou 3 ou … x domaines et dans la ListBox fonctions je n’ai que les fonctions qui correspondent aux domaines sélectionnés. Puis je choisis 2 ou x fonctions et dans la ListBox classes je n’ai que celles correspondantes etc. C’est important car il pourra y avoir, à terme, des dizaines de domaines, de fonctions, de classes etc. Ces ListBox sont extraites du tableau général qui contiendra des milliers de lignes…
 

Dranreb

XLDnaute Barbatruc
Ça ne dit toujours pas ce que vous voulez dégager comme information tout à la fin. Pour isoler une seule ligne des ComboBox à sélection unique suffisent. Ce n'est donc pas ce que vous cherchez.
Je joins le classeur muni du module de service cité, avec en attendant une initialisation beaucoup plus courte des ListBox, basée uniquement sur la plage classique en feuille "ENCADREMENT_DETAIL" (représentée par l'objet Worksheet Feuil3, dont le nom n'est pas très parlant pour le moment…)
 

Pièces jointes

  • SujCBxPirlouit85.xlsm
    53.4 KB · Affichages: 5

Pirlouit85

XLDnaute Nouveau
C’est pour gagner du temps dans la sélection : je sélectionne 2 ou 3 ou … x domaines et dans la ListBox fonctions je n’ai que les fonctions qui correspondent aux domaines sélectionnés. Puis je choisis 2 ou x fonctions et dans la ListBox classes je n’ai que celles correspondantes etc. C’est important car il pourra y avoir, à terme, des dizaines de domaines, de fonctions, de classes etc. Ces ListBox sont extraites du tableau général qui contiendra des milliers de lignes…
Ça ne dit toujours pas ce que vous voulez dégager comme information tout à la fin. Pour isoler une seule ligne des ComboBox à sélection unique suffisent. Ce n'est donc pas ce que vous cherchez.
Je joins le classeur muni du module de service cité, avec en attendant une initialisation beaucoup plus courte des ListBox, basée uniquement sur la plage classique en feuille "ENCADREMENT_DETAIL" (représentée par l'objet Worksheet Feuil3, dont le nom n'est pas très parlant pour le moment…)
Merci pour votre aide
Je regarde le fichier demain et je vous donnerai des détails sur les informations à extraire.
Une initialisation plus efficiente m’intéresse aussi..
 

Pirlouit85

XLDnaute Nouveau
Merci pour votre aide
Je regarde le fichier demain et je vous donnerai des détails sur les informations à extraire.
Une initialisation plus efficiente m’intéresse aussi..
Bonjour,
Je viens de regarder votre fichier et je dois dire que je patauge...
Ok pour Set RngDon = Intersect(Feuil3.[A5:AY1000000], Feuil3.UsedRange) qui sélectionne et nomme la plage de données RngDon
La 2ème ligne remplit la ListBox Domaines en faisant appel à la fonction SujetCBx avec en paramètre la colonne C de RngDon (d'ailleurs je ne comprends pas la syntaxe avec les :)
Et ensuite la fonction SujetCBx est plus qu'ardue. La déclaration de TDon correspond à quoi (Dim TDon()) et comment visualiser son contenu (debug.print me renvois des erreurs etc.)
Peut-être est-il possible simplement faire appel à cette fonction sans la comprendre ? un peu gênant !
Et pour filtrer c'est la fonction SujCBxFiltré j'imagine mais que lui passer en paramètres ?
Bref, intéressant mais sans doute un peu compliqué pour moi...
 

Dranreb

XLDnaute Barbatruc
Oui, il vaut mieux pour l'instant ne comprendre que ce que les fonctions de service renvoient selon les arguments, et non comment elles procèdent. Exactement comme pour des méthodes Excel en somme, puisque vous n'avez même pas accès à leur très volumineuse programmation pour pouvoir le savoir.
Les ': ' sont simplement des séparateurs permettant de spécifier plusieurs instructions sur une même ligne.
Je n'utilise jamais de debug.print. Des espions, plutôt, auxquel on peut préciser tout un tableau dynamique comme TDon si on veut.
Une version avec les SujCBxFiltré.
 

Pièces jointes

  • SujCBxPirlouit85.xlsm
    61.2 KB · Affichages: 13

Pirlouit85

XLDnaute Nouveau
Oui, il vaut mieux pour l'instant ne comprendre que ce que les fonctions de service renvoient selon les arguments, et non comment elles procèdent. Exactement comme pour des méthodes Excel en somme, puisque vous n'avez même pas accès à leur très volumineuse programmation pour pouvoir le savoir.
Les ': ' sont simplement des séparateurs permettant de spécifier plusieurs instructions sur une même ligne.
Je n'utilise jamais de debug.print. Des espions, plutôt, auxquel on peut préciser tout un tableau dynamique comme TDon si on veut.
Une version avec les SujCBxFiltré.
Chapeau !
C'est impressionnant
J'essayais depuis ce matin par une autre méthode : passer, en vba, par Données Avancé (qui doit fonctionner mais assez long...)
Reste à comprendre :
If IsEmpty(SujFltFonc) Then SujFltFonc = SujBdDFonc 'SujFltFonc est vide et donc = SujBdDFonc
On Error Resume Next: ÉtablirTLgnLBx TLgn, ZlListeFonctions, SujFltFonc 'Appel à la fonction ÉtablirTLgnLBx avec les 3 arguments. Mais à quoi correspond TLgn ? et CorrigerListes ,

Merci pour votre investissement
 

Dranreb

XLDnaute Barbatruc
TLgn est une variable globale tableau dynamique d'éléments Long destinée à recevoir les numéros de lignes dans la base des éléments sélectionnés de la ListBox, ce que fait ÉtablirTLgnLBx
J'aurais aussi pu écrire :
VB:
   On Error Resume Next: TLgn = TLgnLBx(ZlListeFonctions, SujFltFonc)
CorrigerListes est une procédure plus bas qui l'utilise pour corriger les listes.
 
Dernière édition:

Statistiques des forums

Discussions
312 215
Messages
2 086 322
Membres
103 178
dernier inscrit
BERSEB50