Listes déroulantes intégrées en cascade

Spitnolan08

XLDnaute Barbatruc
Bonjour à tous,

Passionné d'Excel j'ai déjà réalisé de nombreuses applications en VBA pour utilisation perso ou pro mais à mon humble niveau, c'est à dire avec un langage pas toujours très conventionnel et surtout des codes à rallonge quand je vois les codes hyper condensés mis en ligne par les habitués... mais bon je me débrouille dans mon charabia!

Cependant je suis souvent confronté à des pb qui me prennent des jours à résoudre quand j'y arrive...
Et là je ne sais pas du tout faire. :rolleyes: J'ai parcouru de très nombreuses pages du forum mais n'ai rien trouvé qui correspond à ma recherche : il s'agit de remplacer une succession de combobox fonctionnant en cascade par une seule combobox intégrant elle même une cascade mise à jour automatiquement lors de la selection d'une ligne de la liste précédente.
En espérant que c'est réalisable!!!!!!!!!!!!!!!!!!!!!!!

Ce n'est pas clair ? :D
C'est normal! ;)
C'est pourquoi je vous joint un fichier Excel expliquant en image ce que je veux obtenir. (Nota : Ce fichier ne contient aucun code)

Merci de votre aide
 

Pièces jointes

  • Spitnolan08.xls
    32 KB · Affichages: 271
  • Spitnolan08.xls
    32 KB · Affichages: 269
  • Spitnolan08.xls
    32 KB · Affichages: 270

Spitnolan08

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

RE,

Après m'être encore promené dans le forum et avoir consulté n messages et x pièces jointes qui m'ont fait entrevoir des simplifications de code dans mes UF : Merci Thierry... je me suis dit qu'il était peut être utile d'indiquer la forme de ma BD.:)

C'est pourquoi je vous joint le fichier précédent complété d'un extrait de la BD pour qu'il tienne dans les 48,8ko.

A bientôt
 

Pièces jointes

  • Spitnolan08.xls
    48.5 KB · Affichages: 221
  • Spitnolan08.xls
    48.5 KB · Affichages: 224
  • Spitnolan08.xls
    48.5 KB · Affichages: 218

bqtr

XLDnaute Accro
Re : Listes déroulantes intégrées en cascade

Bonjour Spitnolan08,

Voici un exemple : 1 combobox et deux listbox.
Il n'y a que l'alimentation des différentes box qui est traitée.
Ca pourra peut-être t'aider à avancer.

Bonne nuit

P.O
 

Pièces jointes

  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    40.6 KB · Affichages: 276
  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    40.6 KB · Affichages: 279
  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    40.6 KB · Affichages: 276

Bebere

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

bonjour Spitnolan,Bqtr
activé feuille code gestion,sinon pas de données dans les contrôles
j'ai ajouté des textbox
à bientôt
 

Pièces jointes

  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    32 KB · Affichages: 161
  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    32 KB · Affichages: 160
  • 2-listes-deroulantes-integrees-en-cascade-spitnolan08.zip
    32 KB · Affichages: 164

Spitnolan08

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Merci à vous 2 btqr et Bébère,
Mais aussi à tous ceux qui ont réfléchi ou réfléchissent encore à mon pb...

Cette solution fonctionne et je l'avais testée cette nuit en modifiant un code de @+Thierry de 2005 sans toutefois l'adapter à mon cas particulier. (Je le joint en pièce attachée). Il faut maintenant que j'analyse en détail vos propositions car elles concernent directement mon cas particulier! C'est super :) !

Toutefois (et c'est pour ça que je m'étais contenté d'une modif du code de Thierry) cela ne répond pas tout à fait à mes attentes :eek: car ce que je cherche est de supprimer cette juxtaposition de fenêtres (Combobox, listbox...) pour à partir d'une seule combo avoir une sorte de menu déroulant conservant à chaque sélection le niveau précédent et présentant à sa droite l'étage supérieur (ou inférieur suivant la façon dont on se place ) ...

Mais Merci encore car si mes souhaits ne pouvaient être comblés vos codes me permettraient d'améliorer mon système et ma façon de coder. Et ça c'est tout simplement génial!:)

Bonne journée à tous.
Et à bientôt pour me permettre d'atteindre mes désirs!;)
 

Pièces jointes

  • USF_ListBox_Cascade_Basic+.xls
    37.5 KB · Affichages: 249

myDearFriend!

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Bonsoir Spitnolan08, bqtr, Bebere, le Forum,

Dans le fichier ci-joint, une solution peut-être un peu tirée par les cheveux...

J'ai utilisé principalement les 2 procédures suivantes qui ont pour objectif de créer un menu déroulant (en cascade) :
Code:
[SIZE=2][COLOR=GRAY][B][I]DANS LE MODULE DE CODE DU USERFORM[/I][/B][/COLOR]

[COLOR=NAVY]Private Sub[/COLOR] AfficheMenu()
[COLOR=Green]'myDearFriend! - Décembre 2006[/COLOR]
[COLOR=NAVY]Dim[/COLOR] Plage [COLOR=NAVY]As[/COLOR] Range, Cel [COLOR=NAVY]As[/COLOR] Range, Plage1 [COLOR=NAVY]As[/COLOR] Range, Cel1 [COLOR=NAVY]As[/COLOR] Range
    DetruireMenu
    [COLOR=GREEN]'Définir la plage d'éléments cible (niveau 2)[/COLOR]
    [COLOR=NAVY]Set[/COLOR] Plage = ElmtsCible(ComboBox1.Value, 2)
    [COLOR=GREEN]'Créer le menu déroulant[/COLOR]
    [COLOR=NAVY]With[/COLOR] Application.CommandBars.Add("MonMenu", msoBarPopup, , [COLOR=NAVY]True[/COLOR])
        [COLOR=NAVY]For Each[/COLOR] Cel [COLOR=NAVY]In[/COLOR] Plage
            [COLOR=GREEN]'Ajouter chaque élément au menu déroulant[/COLOR]
            [COLOR=NAVY]With[/COLOR] .Controls.Add(msoControlPopup)
                .Caption = Replace(Cel.Text, "'", " ")
                .OnAction = "'Niv2 """ & .Caption & """'"
                [COLOR=GREEN]'Définir la plage d'éléments cible suivante (niveau 3)[/COLOR]
                [COLOR=NAVY]Set[/COLOR] Plage1 = ElmtsCible(.Caption, 3)
                [COLOR=NAVY]For Each[/COLOR] Cel1 [COLOR=NAVY]In[/COLOR] Plage1
                    [COLOR=GREEN]'Ajouter chaque élément au menu déroulant[/COLOR]
                    [COLOR=NAVY]With[/COLOR] .Controls.Add(msoControlButton)
                        .Caption = Replace(Cel1.Text, "'", " ")
                        .OnAction = "'Niv3 """ & .Caption & """'"
                    [COLOR=NAVY]End With
                Next[/COLOR] Cel1
            [COLOR=NAVY]End With
        Next[/COLOR] Cel
        [COLOR=GREEN]'Afficher le menu déroulant[/COLOR]
        .ShowPopup
    [COLOR=NAVY]End With
End Sub[/COLOR]

[COLOR=NAVY]Private Function[/COLOR] ElmtsCible(Categ [COLOR=NAVY]As String[/COLOR], Col [COLOR=NAVY]As Byte[/COLOR]) [COLOR=NAVY]As[/COLOR] Range
[COLOR=NAVY]Dim[/COLOR] Plage [COLOR=NAVY]As[/COLOR] Range
[COLOR=NAVY]Dim[/COLOR] Ldeb [COLOR=NAVY]As Long[/COLOR], Lfin [COLOR=NAVY]As Long
    With[/COLOR] Sheets("Base")
        Ldeb = .Columns(Col - 1).Find(Categ, LookAt:=xlWhole).Row
        Lfin = .Cells(Ldeb, Col - 1).[COLOR=NAVY]End[/COLOR](xlDown).Row - 1
        [COLOR=NAVY]Set[/COLOR] Plage = .Range(.Cells(Ldeb, Col), .Cells(Lfin, Col))
        [COLOR=NAVY]Set[/COLOR] ElmtsCible = Application.Intersect(Plage, .Columns(Col).SpecialCells(xlCellTypeConstants, 3))
    [COLOR=NAVY]End With
End Function[/COLOR][/SIZE]
Par contre, j'ai dû recontruire ta base de données autour d'une structure qui m'a semblé plus facile à manipuler. Tu peux l'alimenter à loisir dès lors que tu respectes strictement cette structure sur 3 colonnes.

Cordialement,
 

Pièces jointes

  • mDF_ComboBoxEnCascade.zip
    22.6 KB · Affichages: 213
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Bonne nuit à vous!

J'étais un peu scotché sur un autre sujet et je ne regarde ta solution que maintenant...

Vu l'heure tardive je vais aller me coucher et essayerais de comprendre ton code plus tard, mais en tout cas cela correspond exactement à ce que je veux faire :) même si tu prétends que c'est tiré par les cheveux.

Pour la base de données ce n'est à priori pas vraiment un problème.

Je reviendrais vers vous pour vous tenir au courant dès que je pourrais.

Merci beaucoup
 

bqtr

XLDnaute Accro
Re : Listes déroulantes intégrées en cascade

Bonjour tous le monde, myDearFriend!

Je suivais ce fil car je trouvais le sujet interéssant, et j'étais curieux de savoir si quelqu'un allait y arriver. Eh bien, même si la façon de faire est "tirée par les cheveux", le résultat est parfait. Utiliser une barre de commande avec le contenu des cellules comme éléments du menu, je ne savais même pas que cela était possible. C'est vrai que j'en suis encore au début avec VBA, mais bon !.

En tous cas superbe démo.

Bonnes fêtes de fin d'année à tous

P.O
 

Spitnolan08

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Sire MyDearFriend,
Chers tous,

Le code créé par Sa Majesté est tout simplement superbe : sobre, élégant, racé… les mots me manquent !

Je viens de passer quelques heures (mais oui !!!!) à en comprendre toutes les subtilités pour l’adapter totalement à ma configuration, et il y en a encore quelques unes qui me font défaut.

Dans ma modeste première tentative d’adaptation de ce must (en pièce jointe), il y a quelque chose que je ne comprends pas : Lorsque je sélectionne dans le menu de niveau 4 des items présentant des parenthèses (Ex : sélection en niv 3 de « FRAIS ET TAXES » puis sélection de « Taxes d'urbanisme (TLE / TDENS / TDCAUE / EV) », « Taxes d'assainissement (TRE) » ) ni le libellé du choix 4 ni le code correspondant ne s’affichent alors que ça marche dans tous les autres cas.:mad: Le problème vient de l’instruction en gras ci-dessous : (Nota : je ne sais pas comment certains font pour avoir une fenêtre code ni d'ailleurs pour mettre des citations d'autres messages.)

‘Private Function SearchCode(LibNiv As String, Col As Byte) As String
Dim LLibNiv As Long
With Sheets("Base")
LLibNiv = .Columns(Col).Find(LibNiv, LookAt:=xlWhole).Row
SearchCode = .Cells(LLibNiv, Col - 1).Value
End With
End Function

Quelqu’un a-t-il une idée de la raison et de la solution ?

Pour la partie base de données, comme tu peux le constater MyDearFriend, j’ai cherché à me rapprocher de la mienne et je pense qu’on peut arriver à adapter ton code assez facilement pour partir de ma BD. Le plus dur c’est toi qui l’a fait ! Tu m’as permis de découvrir des potentialités que je n’imaginais même pas genre les Functions… Un régal !
Un défi supplémentaire : est il possible d’ajouter dans la bande bleue située en partie gauche des menus popup le code de l’élément ? Oui, je sais, je suis gourmand….

Quelques questions au fil du code pour ceux ou celles qui voudrait me donner quelques explications :
1/ Dans SpecialCells, à quoi correspond l’argument Value = 3 ? Quelles sont les autres valeurs possibles de cet argument ?

2/ Comment le menu popup se place t’il au bon endroit ?

3/ Quelle est l’utilité de la fonction Replace dans la partie création du menu popup ? Je l’ai remplacée et ça fonctionne sans pb… Mais si MyDearFriend l’a placée là c’est qu’elle doit avoir un intérêt dans certains cas ?? Ah oui, elle modifie légèrement le fonctionnement de la private Function présentée plus haut… ?!?

4/ Je ne sais plus mais je ne vais pas continuer à vous embêter avec toutes mes questions en cette veille de nouvel an…

Meilleurs vœux à tous
et à bientôt sur ce fil ou un autre.
 

Pièces jointes

  • My_ComboBoxEnCascade.zip
    28.2 KB · Affichages: 131
  • My_ComboBoxEnCascade.zip
    28.2 KB · Affichages: 129
  • My_ComboBoxEnCascade.zip
    28.2 KB · Affichages: 132

myDearFriend!

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Bonsoir Spitnolan08, bqtr, Bebere,

Tu trouveras ci-joint, une nouvelle adaptation du fichier pour tenter de répondre au mieux à ta demande.

Spitnolan08 à dit:
il y a quelque chose que je ne comprends pas : Lorsque je sélectionne dans le menu de niveau 4 des items présentant des parenthèses (Ex : sélection en niv 3 de « FRAIS ET TAXES » puis sélection de « Taxes d'urbanisme (TLE / TDENS / TDCAUE / EV) », « Taxes d'assainissement (TRE) » ) ni le libellé du choix 4 ni le code correspondant ne s’affichent alors que ça marche dans tous les autres cas.
Ce n'est pas les parenthèses qui causent problème mais la présence d'apostrophe. C'est dû notamment à ma fonction Replace() dont tu parles un peu plus loin. J'ai dû utiliser ce subterfuge car la présence de l'apostrophe rendait inopérant le passage d'arguments dans la ligne :
Code:
[SIZE=2].OnAction = "'Niv3 """ & .Caption & """'"[/SIZE]
Je suppose qu'on pourrait essayer de contourner ce problème à grand coup de Chr() et compagnie mais je n'ai pas pris le temps de tester...

Spitnolan08 à dit:
Un défi supplémentaire : est il possible d’ajouter dans la bande bleue située en partie gauche des menus popup le code de l’élément ?
Non et Oui !
Non, car dans cette bande bleue on ne peut y mettre que des icônes. Non encore car aucune icône n'est possible sur le premier niveau de menu (celui qui se termine par une petite flèche) car c'est un ControlPopUp, il est lui même conteneur d'un autre niveau. A ma connaissance le ControlPopUp ne peut afficher d'icône.
Oui, sur le dernier niveau seulement (ControlButton), si on utilise des icônes représentants des chiffres pour sympoliser tes codes. On le ferait comme ça :
Code:
[SIZE=2]                    [COLOR=NAVY]With[/COLOR] .Controls.Add(msoControlButton)
                        .Caption = ....
                        .OnAction = ....
                        [B].FaceId = 71[/B]
                    [COLOR=NAVY]End With[/COLOR][/SIZE]
Pour info, les chiffres de 0 à 9 sont représentés par les codes 70 à 79.

Spitnolan08 à dit:
Dans SpecialCells, à quoi correspond l’argument Value = 3 ? Quelles sont les autres valeurs possibles de cet argument ?
L'aide VBA sur le mot clé SpecialCells devrait t'en apprendre d'avantage. La valeur 3 correspond au cumul des deux valeurs xlTextValues (qui vaut 2) et xlNumbers (qui vaut 1). Pour connaître les valeurs correspondant à ces constantes, dans l'éditeur VBE, tu fais F2 pour afficher l'explorateur d'Objets, puis une recherche sur SpecialCellsValue. En sélectionnant les différentes constantes, tu obtiens leur valeur au bas de la fenêtre.

Spitnolan08 à dit:
Comment le menu popup se place t’il au bon endroit ?
Avec la méthode ShowPopup, tu peux spécifier des coordonnées X,Y mais si tu ne mets rien, les coordonnées du curseur de souris sont automatiquement prises en compte.

Dans le fichier joint, j'ai contourné ces problèmes rencontrés en concaténant les Eléments et Codes associés dans l'affichage du menu déroulant (séparés par 3 espaces consécutifs) et en scindant (fonction Split) la chaine obtenue dans les macros Niv3() et Niv4() pour scinder à nouveau les valeurs et les associées aux bons contrôles.
Une petit remarque au passage, l'utilisation de contrôles Label me paraît plus indiqué (que les TextBox) si l'objectif est simplement d'afficher des données sans permettre de modification.

Cordialement,
 

Pièces jointes

  • My_ComboBoxEnCascade.zip
    33.5 KB · Affichages: 282
  • My_ComboBoxEnCascade.zip
    33.5 KB · Affichages: 277
  • My_ComboBoxEnCascade.zip
    33.5 KB · Affichages: 278

Spitnolan08

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

MyDearFriend, bqtr, Bebere,
Encore merci ; il ne me reste plus qu’à adapter complètement ce code à mes différentes applications.

MyDearFriend, en ce qui concerne la fonction specialcells j’avais tout essayé avant de poster ma question mais je n’avais rien trouvé ni sur l’aide VBA, ni sur l’aide VBE : Dans l’aide VBA il y a des indications sur les différents paramètres de cet argument mais les valeurs des constantes ne sont pas détaillées… J’ai bien sûr re-essayé suite à ton post et j’ai fini par mettre la main dessus. Ceci dit je n’aurais jamais imaginé que l’addition de 2 constantes donnait une troisième constante union des deux précédentes…
Donc merci pour ta réponse.

Pour la bande bleue du menu popup j’ai essayé ta proposition et ça ne marche effectivement que pour le dernier niveau avec une font pas top. Le but de la question était d’essayer de joindre l’utile à l’agréable en utilisant cette zone vierge inusitée, mais comme ta variante de code est superbe : Que demande le peuple ! Au fait combien de niveaux de menus peut on créer dans cette config ?

Label ou TextBox ? Tu as sûrement raison car pour les textbox il faut en plus penser à les locker lorsqu'ils sont uniquement utilisés pour l'affichage.


  • Je savais bien que j’avais oublié une question :
    Lorsqu’un item (a par exemple) de la combo est sélectionné, le menu se déclenche. Une fois la sélection de tous les niveaux achevée ; si on veut revenir en arrière pour modifier son choix dans la même catégorie que l’item de la combo précédemment choisi (a), il faut d’abord en sélectionner un autre (b, c…) puis sélectionner de nouveau le bon item (a) pour que les menus s’affichent, sinon rien ne se passe.
    J’ai depuis essayé différentes modif du code en ajoutant une sub avec des évènements différents pour la combo : Ca produit des effets parfois surprenants mais ça ne marche pas. Et comme je ne comprends pas la raison, j’ai finalement ajouté l’instruction
    ComboBox1.Value = ""
    à la fin de la procédure Private Sub ComboBox1_Click() ce qui améliore légèrement le fonctionnement puisqu’on n’a plus à suivre le chemin alambiqué ci-dessus.

Sur ce, je dis
Courtoisement
 

myDearFriend!

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Bonjour Spitnolan08, bqtr, Bebere, le Forum,

Spitnolan à dit:
Au fait combien de niveaux de menus peut on créer dans cette config ?
A mon avis, techniquement, il n'y a pas de limite, mais il convient tout de même de rester raisonnable pour le confort de l'utilisateur final.


L'ajout de ComboBox1.Value = "" en fin de procédure ComboBox1_Click() devrait effectivement résoudre le problème dont tu parles.

Bonne chance pour la suite de ton projet.
Cordialement,

Meilleurs Voeux à toutes et tous !
 

jjestin

XLDnaute Nouveau
Re : Listes déroulantes intégrées en cascade

Bonjour,

Je suis le mari d'un instit. Elle a comme obligation de remplir tous les jours un cahier journal. L'inspection académique fournie aux enseignants la liste des domaines d'activités, les compétences et les activités à travailler.

Je souhaite lui faciliter l'implémentation de son cahier journal avec Excel en utilisant des listes déroulante en cascades.

Je pensais naïvement que je pourrais développer cela sans utiliser VBA car je n'y comprends rien.

Hélas à priori cela n'est pas possible.

Je suis tombé sur ton exemple qui correspond exactement au besoin.

Par contre est-il possible de faire alimenter des cellules d'une feuille de calcul par les valeurs des choix 1, 2, 3 et 4.

Merci par avance pour ton aide.

@+
 

myDearFriend!

XLDnaute Barbatruc
Re : Listes déroulantes intégrées en cascade

Bonjour jjestin,

Dans l'exemple fourni, tu vois qu'on récupère les valeurs pour les afficher dans des contrôles Label alignés au bas du Userform. Il est possible en effet d'afficher ces valeurs dans des cellules au lieu des contrôles Label.
Cela dit, d'après ce que je lis, je ne suis pas sûr que tu sois sur la bonne voie pour ton projet.
Le mieux, me semble-t'il serait de poster un exemple clair et complet de ce que tu souhaites, accompagnés des travaux que tu as déjà essayé de faire. Attention toutefois à épurer ton fichier pour qu'il puisse être zippé à moins de 50 ko et de veiller à supprimer (ou remplacer) toute donnée confidentielle.
Je pense qu'il conviendrait de créer un nouveau sujet pour ta demande afin de maximiser tes chances d'obtenir d'autres propositions de solutions éventuelles.

Cordialement,
 

Xion

XLDnaute Junior
Re : Listes déroulantes intégrées en cascade

Bonjour à tous,


Tout d'abord, bravo pour cette solution, je l'utilise dans mon boulot et cela me sert enormément !!!!

Je suis désolé de continuer une discussion sur ce post qui date un peu, mais j'ai besoin de savoir si il est possible d'ajouter une cascade supplémentaire en utilisant le même modèle en ajoutant 2 colonnes de données dans la feuille base ???

J'essaye, mais j'ai des erreurs sur les arrays ou bien je prend trop de données a chaque fois... Je ne pense pas avoir la bonne méthode...

Si quelqu'un a une idée n'hesitez surtout pas !! Merci d'avance.

Cordialement,
Xion
 

Discussions similaires

Statistiques des forums

Discussions
312 410
Messages
2 088 163
Membres
103 752
dernier inscrit
FG2