VBA - Liste déroulante suivant des conditions [réédité]

Bonjour !

Je me torture avec ça depuis un moment...

Partie excel:

J'ai une feuille "items".

Sur cette feuille, un tableau, avec en colonne A tout un tas de références toutes différentes.

En colonne H, la gamme de chaque référence : A/ B/ C/ D (plusieurs références peuvent donc avoir la même gamme).

En colonne I, le type de chaque référence : Rouge / Vert / Bleu (plusieurs références peuvent donc être du même type).

Partie VBA:

J'ai 3 userforms, un pour chacun des 3 types. C'est à dire que le type est défini par rapport à la fenêtre dans laquelle on se trouve. Chacune ont à peu près la même organisation.

Elles ont un premier endroit avec un cadre, dans lequel il y a des boutons d'option pour sélectionner la gamme voulu parmi celles existantes.

Ensuite un deuxième cadre contenant une zone de liste.

C'est là que je bloque...

Je veux que lorsqu'on clic sur la zone de liste, la liste des références affiche seulement celles dont la gamme a été sélectionné dans le premier cadre, en prenant en compte le type que l'on veut..

Je pense avoir pas trop mal décris mon bazar

Quelqu'un aurait-il des solutions à m'apporter svp ??

Merci !

Edit: je reformule avec les vrais nom et joins le fichier en question

Bonjour Dez, bonjour el forum,

Commence par mettre le fichier en pièce jointe...

1er post réédité

FIchier ajouter au premier message

Ou tu voulais le fichier entier ?

J'avais essayé divers trucs dans le code mais je galère je suis reparti de zéro pour le code vba x) J'ai encore énormément de choses à faire dans ce fichier et peu de temps, et je bloque là dessus...

Cela dit si je trouve comment faire ça je saurai faire plus facilement le reste je pense, car ce que je demande là est assez complexe (de mon point de vu).

Je suis sous excel 2016.

Bonjour Dez, bonjour le forum,

Le code pour l'UserForm UF_Electronics :

Private Const C = "Electronic" 'déclare la constante C (Catégorie)
Private O As Worksheet 'déclare la variale O (Onglet)
Private TV As Variant 'déclare la variale TV (Tableau des Valeurs)
Private G As String 'déclare la variale G (Gamme)
Private TL() As Variant 'déclare la variale TL (Tableau des Lignes)
Private I As Integer 'déclare la variale I (Incrément)
Private J As Integer 'déclare la variale J (incrément)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Worksheets("Produits") 'définit l'onglet O
TV = O.Range("A6").CurrentRegion 'définit le tableau des valeurs TV
End Sub

Private Sub Opt_MKI_Click() 'au clic d'ans l'option "MKI"
G = "MKI" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKII_Click() 'au clic d'ans l'option "MKII"
G = "MKII" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKIII_Click() 'au clic d'ans l'option "MKIII"
G = "MKIII" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Sub Alim() 'procédure d'alimentation de la combobox Liste_Electronics
Erase TL 'vide le tableau des lignes TL
J = 0 'initialise la variable J
Liste_Electronics.Clear 'vide la combobox Liste_Electronics
For I = 2 To UBound(TV) 'boucle sur toutes les lignes I du tableau des Valeur (en partant de la seconde)
    If TV(I, 8) = G And TV(I, 9) = C Then 'condition : si la gamme et la catégorie correspondent
        ReDim Preserve TL(J) 'redimensionne le tableau des ligne TL
        TL(J) = TV(I, 1) 'définit la valeur de TL(J) (le nom du produit)
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
If J > 0 Then Liste_Electronics.List = Application.Transpose(TL) 'alimente la combobox avec le tableau TL transposé
End Sub

Private Sub Button_AnnulerElec_Click()
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Le code pour l'UserForm UF_Cables :

Private Const C = "Cable" 'déclare la constante C (Catégorie)
Private O As Worksheet 'déclare la variale O (Onglet)
Private TV As Variant 'déclare la variale TV (Tableau des Valeurs)
Private G As String 'déclare la variale G (Gamme)
Private TL() As Variant 'déclare la variale TL (Tableau des Lignes)
Private I As Integer 'déclare la variale I (Incrément)
Private J As Integer 'déclare la variale J (incrément)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Worksheets("Produits") 'définit l'onglet O
TV = O.Range("A6").CurrentRegion 'définit le tableau des valeurs TV
End Sub

Private Sub Opt_MKI_Click() 'au clic d'ans l'option "MKI"
G = "MKI" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKII_Click() 'au clic d'ans l'option "MKII"
G = "MKII" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKIII_Click() 'au clic d'ans l'option "Ultimate"
G = "Ultimate" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Sub Alim() 'procédure d'alimentation de la combobox Liste_Cables
Erase TL 'vide le tableau des lignes TL
J = 0 'initialise la variable J
Liste_Cables.Clear 'vide la combobox Liste_Cables
For I = 2 To UBound(TV) 'boucle sur toutes les lignes I du tableau des Valeur (en partant de la seconde)
    If TV(I, 8) = G And TV(I, 9) = C Then 'condition : si la gamme et la catégorie correspondent
        ReDim Preserve TL(J) 'redimensionne le tableau des ligne TL
        TL(J) = TV(I, 1) 'définit la valeur de TL(J) (le nom du produit)
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
If J > 0 Then Liste_Cables.List = Application.Transpose(TL) 'alimente la combobox avec le tableau TL transposé
End Sub

Private Sub Button_AnnulerElec_Click()
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Le code pour lUserForm UF_Accessoire :

Private Const C = "Accessoire" 'déclare la constante C (Catégorie)
Private O As Worksheet 'déclare la variale O (Onglet)
Private TV As Variant 'déclare la variale TV (Tableau des Valeurs)
Private G As String 'déclare la variale G (Gamme)
Private TL() As Variant 'déclare la variale TL (Tableau des Lignes)
Private I As Integer 'déclare la variale I (Incrément)
Private J As Integer 'déclare la variale J (incrément)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Worksheets("Produits") 'définit l'onglet O
TV = O.Range("A6").CurrentRegion 'définit le tableau des valeurs TV
End Sub

Private Sub Opt_MKI_Click() 'au clic d'ans l'option "MKI"
G = "MKI" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKII_Click() 'au clic d'ans l'option "MKII"
G = "MKII" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Private Sub Opt_MKIII_Click() 'au clic d'ans l'option "MKIII"
G = "MKIII" 'définit la gamme G
Call Alim 'lance la procédure Alim
End Sub

Sub Alim() 'procédure d'alimentation de la combobox Liste_Accessoires
Erase TL 'vide le tableau des lignes TL
J = 0 'initialise la variable J
Liste_Accessoires.Clear 'vide la combobox Liste_Accessoires
For I = 2 To UBound(TV) 'boucle sur toutes les lignes I du tableau des Valeur (en partant de la seconde)
    If TV(I, 8) = G And TV(I, 9) = C Then 'condition : si la gamme et la catégorie correspondent
        ReDim Preserve TL(J) 'redimensionne le tableau des ligne TL
        TL(J) = TV(I, 1) 'définit la valeur de TL(J) (le nom du produit)
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
If J > 0 Then Liste_Accessoires.List = Application.Transpose(TL) 'alimente la combobox avec le tableau TL transposé
End Sub

Private Sub Button_AnnulerElec_Click()
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Attention ! ce dernier code fontionnera quand tu mettras la Gamme aux accessoires. Actuellement la combobox Liste_Accessoires reste vide...

Merci beaucoup ThauThème !

Je m'attendais pas à ce que tu me sortes tout le code de chaque fenêtre c'est très gentil !

Ca à l'air de bien fonctionner, j'ai compris ce que je n'arrivais pas à faire.

Ton aide m'a permis de comprendre le fonctionnement de quelques trucs et pouvoir continuer plus facilement le reste de ce gros fichier !

Thanks !

Rechercher des sujets similaires à "vba liste deroulante suivant conditions reedite"