XL 2013 COMBOBOX en cascade

Pouletpiou

XLDnaute Nouveau
Bonjour à vous,

Actuellement en alternance au sein d'une entreprise, on m'a confié "une mission" qui consiste en à créer un fichier excel dans le but de trouver des références en fonction des informations entrées dans le formulaire.

Vous trouverez ci-joint mon fichier.

Je bloque sur les ComboBox, en effet, je ne sais pas comment faire pour les configurer.
En effet, selon la materiel que l'on choisi, on aura alors certaines marques puis certaines caractéristiques qui nous proposeront alors les références possibles.
Je ne sais pas si je suis compréhensible ? :)

Je vous remercie d'avance de votre aide,

PP
 

Pièces jointes

  • TEST.xlsm
    29.4 KB · Affichages: 40
  • TEST.xlsm
    29.4 KB · Affichages: 39

Modeste

XLDnaute Barbatruc
Re : COMBOBOX en cascade

Bonjour Pouletpiou et bienvenue,

Voilà un sujet qui revient régulièrement ... tu as fait une petite recherche sur le titre de ta discussion? (voir déjà en bas de page, les sujets similaires)

L'événement Initialize peut-être utilisé pour garnir ta première combo (on peut utiliser un Dictionary, qui est très rapide et gère les doublons)

Au changement de sélection dans la combobox1, on reprend la même technique pour créer la liste de la combobox2, à condition que la colonne A contienne l'item sélectionné dans la combo1

Je te laisse le soin de regarder, tester, comprendre ... et tu verras si tu peux adapter à la suite:
VB:
Private Sub UserForm_Initialize()
Set liste = CreateObject("scripting.dictionary")
With Sheets("PANELS")
For lig = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
    liste(.Cells(lig, 1).Value) = ""
Next lig
End With
ComboBox1.List = Application.Transpose(liste.keys)
End Sub

Private Sub ComboBox1_Change()
ComboBox2.Clear
If ComboBox1.ListIndex = -1 Then Exit Sub
Set liste = CreateObject("scripting.dictionary")
With Sheets("PANELS")
For lig = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
    If .Cells(lig, 1) = ComboBox1 Then liste(.Cells(lig, 2).Value) = ""
Next lig
End With
If liste.Count > 0 Then ComboBox2.List = Application.Transpose(liste.keys)
End Sub

Reviens nous dire si tu as des questions (... ou si j'ai loupé quelque chose)
 

Pouletpiou

XLDnaute Nouveau
Re : COMBOBOX en cascade

Bonjour Modeste,

Merci à toi :)

Effectivement, je suis sûrement allé beaucoup trop vite en créant ce nouveau sujet ... Je rechercherai par la suite avant d'écrire.

Je te remercie de ta réponse qui m'aide beaucoup dans la création de mon formulaire.
Je vais désormais essayer d'ajouter une dernière ComboBox en suivant le code que tu me proposes.


Par contre, dans ton code, je ne vois pas où commence la partie pour la ComboBox 2

Est-ce à partir d'ici :

Code:
For lig = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
 

Modeste

XLDnaute Barbatruc
Re : COMBOBOX en cascade

Re,

Cette ligne
Code:
For lig = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
... dit seulement: pour chaque ligne, depuis la ligne 2 jusqu'à la ligne correspondant à la dernière cellule non-vide, en colonne 2

La ligne suivante (avec le If) permet donc, pour chaque ligne ainsi passée en revue, si le matériel qui figure en colonne A est le même que celui renseigné dans la combobox1, de créer une entrée dans le Dictionary avec la valeur de la colonne B.

La "partie pour la Combobox2" commence donc à la ligne Private Sub ComboBox1_Change(), puisque j'évoquais: "Au changement de sélection dans la combobox1".

... Tu me suis?
 

Pouletpiou

XLDnaute Nouveau
Re : COMBOBOX en cascade

Ok donc, si je suis bien, je dois reprendre tout ce code pour une ComboBox3 en fonction des infos entrées dans la Combox 2

en effectuant les modifications suivantes ?

Code:
Private Sub ComboBox2_Change()
ComboBox3.Clear
If ComboBox2.ListIndex = -1 Then Exit Sub
Set liste = CreateObject("scripting.dictionary")
With Sheets("PANELS")
For lig = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
    If .Cells(lig, 1) = ComboBox2 Then liste(.Cells(lig, 2).Value) = ""
Next lig
End With
If liste.Count > 0 Then ComboBox3.List = Application.Transpose(liste.keys)
End Sub
 

Pouletpiou

XLDnaute Nouveau
Re : COMBOBOX en cascade

Je vais faire des recherches.

A votre avis, est-ce que je peux partir d'un code simple tel que celui-ci :

Code:
Private Sub UserForm_Initialize()
With Sheets("PANELS")
ComboBox1.List = .Range("A2:A" & .Range("A65536").End(xlUp).Row).Value
ComboBox2.List = .Range("B2:B" & .Range("B65536").End(xlUp).Row).Value
ComboBox3.List = .Range("C2:C" & .Range("C65536").End(xlUp).Row).Value
End With
 

Dranreb

XLDnaute Barbatruc
Re : COMBOBOX en cascade

Disons qu'il n'y a presque pas plus d'instructions à mettre et plus courtes pour instruire l'objet ComboBoxLiées de son cahier de charges, et qu'il se charge tout seul de limiter les choix proposés en fonction de ceux effectués, voire d'assumer le seul qui reste. Il renvoie à l'intention de l'UserForm le ou les numéros de lignes dans la base qui y correspondent via une procédure évènement.
 

Modeste

XLDnaute Barbatruc
Re : COMBOBOX en cascade

Re²,
Salut Bernard :) avec un thème comme celui-là, je m'étonnais aussi de ne pas encore t'avoir vu ;)

Pouletpiou si tu parles de Combobox liés ... que vient donc faire ta dernière proposition "dans le jeu de quilles" :confused: Il n'y a plus de cascade, dans ce que tu proposes!?

Avec la listBox3 de ton premier fichier (tu parles maintenant d'une 3e combobox??) j'aurais ajouté à ma première proposition:
VB:
Private Sub ComboBox2_Change()
ListBox3.Clear
If ComboBox2.ListIndex = -1 Then Exit Sub
With Sheets("PANELS")
For lig = 2 To .Cells(Rows.Count, 2).End(xlUp).Row
    If .Cells(lig, 1) = ComboBox1 And .Cells(lig, 2) = ComboBox2 Then ListBox3.AddItem .Cells(lig, 3).Value
Next lig
End With
End Sub
 

Pouletpiou

XLDnaute Nouveau
Re : COMBOBOX en cascade

Merci pour votre aide !

Je continue avec me code Modeste pour ce soir, j'essaye le tiens, Dranreb, demain.

J'ai réussi a ajouter la ComboBox Caractéristique et la ListBox Référence possible. Dernier problème, comment éviter les doublons dans les ComboBox, notamment, la ComboBox 3 (caractéristiques) ?

Cordialement,
Pp
 

Modeste

XLDnaute Barbatruc
Re : COMBOBOX en cascade

comment éviter les doublons dans les ComboBox, notamment, la ComboBox 3 (caractéristiques) ?

Pas vu de Combobox3 dans ton fichier de départ? Tu travailles toujours sur ce même fichier?? Dans ton fichier, les caractéristiques étaient dans la Combobox2!?

N'y a-t-il pas d'ailleurs, dans ton UserForm moins de combos que de colonnes en feuille PANELS (par contre, les combos correspondent aux colonnes de la feuille BASE DE DONNEES)
Bref, fournis un fichier actualisé, si ce n'est plus le même

Dans les autres combos, il ne devrait pas y avoir de doublons (sauf si tu fais référence à SIEMENS dans les marques: là c'est parce qu'en B3 de la feuille PANELS, cette marque est écrite avec une espace après le 's' final)

Si tu veux parler de la ListBox3 où il y aurait des doublons, alors oui il faudra utiliser un dico aussi (pas vu qu'il y avait des doublons possibles à ce niveau)
 

Modeste

XLDnaute Barbatruc
Re : COMBOBOX en cascade

Dans la Combobox2, je ne vois pas de doublons, sauf dans le cas que j'ai indiqué tout à l'heure. Corrige la cellule B3 et re-teste ensuite.

Dans cette version, la Combobox3 est garnie sans doublons.

Pour la listBox, tu risques vraiment d'avoir, dans ta feuille PANELS, des lignes dont les 4 colonnes seront rigoureusement identiques??
 

Pièces jointes

  • Combos en Cascade(Pouletpiou).xlsm
    28.4 KB · Affichages: 40

Discussions similaires