Utilisation de ComboBox dépendant d'un autre ComboBox
Bonjour le forum,
J'espère que tous le monde est bien réveillé ^^
Petite explication : j'ai une feuille avec des domaines A, B, C et des désignations 1, 2, 3, 4, ect...
Mon objectif serais de pouvoir afficher dans une comboBox les domaines et en fonction du domaine afficher la désignation.
Je sais afficher les éléments dans une comboBox mais :
- pas les regrouper, j'entends par là que le domaine A peut avoir plusieurs désignations
- ni l'affichage du deuxième comboBox
J'espère que je suis à peut près clair.
Je vous joint un fichier.
Merci d'avance pour toute l'aide que vous m'apporterez.
Bye
Une proposition:
Bonjour à tous les deux,
Merci pour vos réponses qui correspondent à mes attentes.
D'habitude j'arrive toujours à adapter les codes à mes fichiers mais pas cette fois ...
Le travail se passe sur la feuille "équipement" et dans le userform c'est la partie "texte réglementaire" que j'essai de remplir. On choisi le domaine, puis la désignation et ensuite le code s'affiche.
Les données que je veux sont dans la feuille "texte réglementaire"
Je vous joint mon fichier.
PS : je m'excuse pour le double travail que vous allez faire, j'aurais du vous donner mon fichier d’ambler.
Merci d'avance.
Il est certain que tu aurais dû mettre ton fichier et être plus explicite...
S'agissant du modèle que tu as soumis au forum dont tu n'arrives pas à adapter les réponses, je n'ai pas l'impression que tu aies vu l'étendue des modifications que pour ma part j'y avais apportées. En tout cas, si tu l'analyses, tu y trouveras tous les éléments d'un traitement classique de listes-cascade...
Bonjour,
Je ne suis pas une experte en VBA je le découvre seulement c'est mon premier projet.
Certes j'ai sous estimé le travail à réaliser pour atteindre l'objectif de mon fichier.
Et ne pas vous donner mon fichier était une erreur mais je ne voulais pas avoir un code tous fait je voulais pouvoir me l’approprié comme j'avais réussi jusqu'à présent je n'ai pas doutée.
Mais il s'avère que ce projet et cette programmation dépasse mes compétences, néanmoins je n’abandonne pas je vais continuer d'essayé avec le travail que vous avez déjà fait.
Merci pour l'aide que vous m'avez apporté.
Bye
Le problème est plus dans la façon d'avoir posé la question et non ta motivation à apprendre.
De même que pour MFerrand, je me suis basé sur ta demande initiale, ce qui entraîne donc une adaptation impossible.
Vu que tu avais des A,B,C etc... j'ai codé des éléments qui étaient censés être des lettres, et donc dans mon code je convertis ces lettres en numéro dans l'alphabet (ce qui rend beaucoup plus rapide leur traitement).
Vouloir apprendre est tout à ton honneur. Mais si tu veux une adapation il faudra fixer beaucoup plus clairement ce que tu as et ce que tu veux =) Tu peux également le contacter par MP pour de "petits" points bloquant (de compréhension ou de réalisation), j'y répondrai sans problème.
D'accord.
Je vais essayer d'expliquer mon problème le plus clairement possible.
J'ai un fichier avec des feuilles ici je m’intéresse à la feuille "Texte réglementaire" et "Équipements".
La feuille "Équipements" possèdent un Userform associé à l'image + bleu.
Ce userform est définitivement construit mais partiellement coder.
L'encadrer "Texte réglementaire" n'est pas coder. C'est pour cette partie que je bloque.
L'objectif est d'afficher dans le textBox "Code", 1 comboBox "Domaine", 2 comboBox "Désignation" les données qui se trouve dans la feuille "Texte réglementaire", les trois premières colonnes.
J’espère que mes explications sont suffisantes pour vous expliquer mon projet.
Je remet le fichier propre avec des indications complémentaires.
MFerrand a écrit :Bonjour,
A étudier.
Bonjour MFerrand,
Il s'avère que j'avais la même problématique que Rafilou, et comme d'habitude le fichier que tu as proposé réponds parfaitement à mes attentes.
Comme j'aime bien comprendre ce que je fais, pourrais-tu commenter ta solution, notamment le code que tu proposes et le choix des références de noms de variables: ListeDom, EXTRAIRE, Domaine et Désign.
Merci de ton aide,
Bien Cordialement,
Kytockx
Bonjour à tous !
Kitockx, je me souviens avoir traité un problème quasi identique à celui posé par Rafilou (sauf que sa configuration différait assez sensiblement de son modèle...), je ne sais plus si c'était toi le demandeur mais tu le sais mieux que moi
Dans les 2 cas j'ai appliqué la même méthode (à un détail près), méthode assez traditionnelle de traiter les listes-cascade, en l'adaptant selon les particularités.
Méthode :
On part d'une base de données comportant x champs (colonnes) contenant chacun des données devant alimenter une liste déroulante où à partir de la 2e liste devient dépendante du choix précédent : col 1 => liste 1, col 2 => liste 2....
Chaque ligne de la base est constituée par une série liant les éléments de chacun des champs, donc une possibilité que l'on peut extraire lors d'une série de choix dans chacune des listes.
Les listes à tirer de la base pour alimenter chaque liste de choix doit être composée d'éléments uniques, et à partir du choix 2 uniquement d'éléments pouvant être lié au(x) choix précédent(s) fait(s).
Pour constituer les différentes listes d'éléments uniques on trie d'abord la base sur toutes les colonnes.
NB- Le tri d'une plage peut se faire sur 3 colonnes simultanément ; si l'on en a plus, il faut procéder à plusieurs tris successifs. Par exemple si l'on doit trier 5 colonnes, on fait un premier tri sur les colonnes 4 et 5, puis un second tri sur les colonnes 1, 2 et 3 ; les 5 colonnes seront alors ordonnées dans l'ordre de priorité 1 à 5.
Ensuite on fait une extraction par filtre avancé (vers un emplacement qu'on a prédéfini), d'éléments uniques de la colonne 1 : on a constitué ainsi la liste de choix 1.
On fait de la même façon une extraction d'éléments uniques des colonnes 1 et 2, la liste de choix 2 sera constituée par la partie de la 2e colonne pour laquelle la 1re colonne indique le choix 1 effectué (soit une plage qu'on cerner facilement par formule en utilisant EQUIV et NB.SI).
S'il y a plus de 3 colonnes, on fait de même une extraction d'éléments unique des colonnes 1,2,3...
Pour la dernière colonne, la liste de choix correspondante sera définie directement à partir de la base.
Pour faciliter ces opérations, il est judicieux de nommer des plages :
- on nomme la première colonne, en incluant l'en-tête (nécessaire pour le filtrage avancé), nom dynamique de préférence (sauf si l'on est sûr que la base est définitive et ne variera jamais)
[Je ne nomme en principe que la 1re colonne, cela suffit pour pointer n'importe quelle partie de la base par redimensionnement et éventuellement décalage.]
- on nomme la liste choix 1 (éléments uniques extraits) sans inclure l'en-tête et de façon dynamique
- on prévoit une cellule pour consigner le choix 1, ce qui permet de nommer la liste de choix 2 avec une formule qui utilise le choix 1 pour déterminer où la liste commence et son extension : la plage renvoyée par le nom variera en fonction du choix 1.
Les opérations de Tri-Extraction des listes sont à faire chaque fois que l'on modifie la base. A ce titre, une procédure autonome peut être lancée pour mettre les listes à jour lors de modifications, cela allège éventuellement l'ouverture du formulaire, sinon elles peuvent être effectuées lors du lancement du formulaire.
On peut également imaginer de stocker une valeur booléenne quelque part, qui serait par exemple mise à VRAI dès qu'on touche à la base, et remise à FAUX dès mise à jour faite pour que la procédure ne soit exécutée que si la base a été modifiée, sans que l'on ait à sans occuper manuellement.
En ce qui concerne les Combos, pour le 1, on peut y affecter définitivement la liste de choix 1 (RowSource dans la fenêtre propriété, définissant les propriétés par défaut), le combo aura toujours la bonne liste, puisqu'elle est initialisée à l'ouverture du formulaire.
Pour la Combo2, la liste n'est pas définie tant qu'il n'y a pas de choix fait dans la Combo 1. On s'est tout de même facilité l'affectation de la liste en cours d'exécution car c'est toujours le même nom qu'on affectera à RowSource de Combo 2, c'est le contenu défini par ce nom qui variera.
A l'ouverture, pas de choix Combo1, pas de liste Combo2. Lors d'un choix Combo1, la procédure Combo1_Change va opérer :
- Si choix,
- -elle invalide choix éventuel Combo2 (cas où on revient sur le choix 1 après avoir effectué un choix 2)
- -elle affecte le choix à la cellule prévue pour l'accueillir (ce qui va mettre à jour la liste de choix 2)
- -elle affecte RowSource de Comb2
- Si pas de choix,
- -elle invalide choix éventuel Combo2
- -elle supprime RowSource de Comb2
Voilà le mécanisme pour l'essentiel.
Bonjour,
Merci beaucoup pour votre code.
J'ai essayé de le mixer avec une saisie semi-automatique.
Et dans mon exemple cela fonctionne pour la première combobox1 (celle dont dépend la 2nde).
Mais je bloque pour la combobox 2.
Pouvez-vous m'aider svp? C'est pour l'userform3.
Dim A(), B()
Private Sub UserForm_Initialize()
Set Ws = Sheets("feuil1")
With Me.ComboBox3
For J = 2 To Ws.Range("B" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("B" & J)
Next J
End With
Set F = Sheets("prix de cotation")
A = Application.Transpose(F.Range("P2:P" & F.[P65000].End(xlUp).Row).Value)
Me.ComboBox1.List = A
End Sub
Private Sub ComboBox1_Change()
Set F = Sheets("prix de cotation")
A = Application.Transpose(F.Range("P2:P" & F.[P65000].End(xlUp).Row).Value)
Me.ComboBox1.List = A
If Me.ComboBox1.ListIndex = -1 Then
Me.ComboBox1.List = Filter(A, Me.ComboBox1.Text, True, vbTextCompare)
Me.ComboBox1.DropDown
End If
With Worksheets("prix de cotation")
If ComboBox1.ListIndex >= 0 Then
ComboBox2.ListIndex = -1
.Range("Q1") = ComboBox1.Value
ComboBox2.RowSource = "Article"
Else
ComboBox2.ListIndex = -1
ComboBox2.RowSource = ""
.Range("Q1").ClearContents
End If
End With
End Sub