Userform - Liste déroulante dépendante d'une autre liste déroulante

Bonjour à tous,

J'ai trouvé des sujets similaires sur le forum mais je n'arrive pas à les adapter à mon besoin.

Je suis en train de créer un fichier permettant de répondre aux exigences de la métrologie légale, pour vérifier différents critères permettant de valider ou non un lot.

Pour cela, j'importe toutes les données des sachets pesés, puis je veux choisir UN seul code produit et UN seul code machine.

Actuellement, j'ai réussi à afficher une seule fois chaque code produit et une seule fois chaque code machine dans un Userform, maintenant je voudrais en plus que les codes machines sélectionnables soient ceux qui correspondent au code produit choisi.

image

Voici mon code :

Private Sub UserForm_Initialize()

Ligne = 2

    Do While Cells(Ligne, 1).Value <> ""

    Formulaire.CBproduit.AddItem Cells(Ligne, 1).Value

    Ligne = Ligne + 1

    Loop

    Dim i As Integer
    Dim j As Integer

    If CBproduit.ListCount < 2 Then Exit Sub

    For i = 0 To CBproduit.ListCount - 1
        For j = i + 1 To CBproduit.ListCount - 1
            If CBproduit.ListCount = j Then Exit For
            If CBproduit.List(i) = CBproduit.List(j) Then
                CBproduit.RemoveItem j
                j = j - 1
            End If
        Next j
    Next i

Ligne = 2

    Do While Cells(Ligne, 2).Value <> ""

    Formulaire.CBligne.AddItem Cells(Ligne, 2).Value

    Ligne = Ligne + 1

    Loop

    Dim k As Integer
    Dim l As Integer

    If CBligne.ListCount < 2 Then Exit Sub

    For k = 0 To CBligne.ListCount - 1
        For l = k + 1 To CBligne.ListCount - 1
            If CBligne.ListCount = l Then Exit For
            If CBligne.List(k) = CBligne.List(l) Then
                CBligne.RemoveItem l
                l = l - 1
            End If
        Next l
    Next k

End Sub

Voici le formulaire. Par exemple le code 11760 n'a été produit que sur les machines F1 et F2, je devrais donc pouvoir sélectionner uniquement ces deux lignes.

image

Et l'affichage final obtenu (qui fonctionne parfaitement quand on sélectionne des codes compatibles), pour donner du contexte :

image

Précision : Je ne peux pas nommer les plages car à chaque nouvel import je vais venir écraser les données précédentes.

Bonjour,

Un fichier sans données confidentielles serait mieux pour t'aider.

Tu peux essayer avec :

Sub CBproduit_Change ()

Clear la "CBligne"
refaire une boucle qui cherche
si CBligne est dans CBproduit alors Additem.

Bonjour et merci pour ta réponse.

J'ai essayé le code suivant, ça ne fonctionne pas encore : J'ai bien les valeurs que je souhaite dans CBproduit, par contre dans CBligne je n'ai rien...

Private Sub CBproduit_Change()

Sheets("BDD").Select

ligne = 2

CBligne.Clear

    Do While Cells(ligne, 2).Value <> ""

        If Cells(ligne, 1).Value = Sheets("Protocole").Range("F9").Value Then

        Formulaire.CBligne.AddItem Cells(ligne, 2).Value

        ligne = ligne + 1

        Else

        ligne = ligne + 1

        End If        
    Loop

    Dim k As Integer
    Dim l As Integer

    If CBligne.ListCount < 2 Then Exit Sub

    For k = 0 To CBligne.ListCount - 1
        For l = k + 1 To CBligne.ListCount - 1
            If CBligne.ListCount = l Then Exit For
            If CBligne.List(k) = CBligne.List(l) Then
                CBligne.RemoveItem l
                l = l - 1
            End If
        Next l
    Next k

End Sub

Saurais tu trouver d'où vient l'erreur ?

Il faut prendre en compte que le code produit que j'ai sélectionné n'est pas forcément le premier à apparaître.

Si c'est trop compliqué de m'aider avec ces informations, je modifierai le fichier demain pour supprimer les données confidentielles.

Merci

Exact, trop compliqué d'expliquer sans fichier.

Il faut garder ton UserForm_Init comme tu l'avais fait + CBproduit_Change

mais dans ce CBproduit_Change tu n'as pas fait "si CBligne est dans CBproduit alors Additem"

Bonjour,

Je joins le fichier en question.

mais dans ce CBproduit_Change tu n'as pas fait "si CBligne est dans CBproduit alors Additem"

Effectivement ce n'est pas clair mais je l'ai bien ajouté, j'avais auparavant envoyé la valeur de Cbproduit en F9, je la retrouve donc avec cette ligne :

     If Cells(ligne, 1).Value = Sheets("Protocole").Range("F9").Value Then

Je ne voyais pas comment faire autrement pour dire si CBligne est dans CBproduit alors Additem. Et je voulais garder dans une cellule les valeurs choisies.

J'ai bien toujours le UserForm_Init, je ne l'ai pas mi pour éviter un message trop long.

Merci pour ton aide :)

Quentin

6test.xlsm (190.39 Ko)

Bonjour,

Aucune donnée sur BDD, tu pourras trouver un nouvel Userform dans la feuille Exemple.

image
5test.xlsm (150.30 Ko)
Private Sub CBproduit_Change()
CBligne.Clear
Ligne = 2
Do While Cells(Ligne, 2).Value <> ""
    If CBproduit.Value = Cells(Ligne, 1).Value Then
        UF_Exemple.CBligne.AddItem Cells(Ligne, 2).Value
    End If
    Ligne = Ligne + 1
Loop
End Sub
    

A+

Bonjour,

Je suis étonné du fait qu'il n'y ait pas de données dans l'onglet BDD, j'avais pourtant laissé les deux premières colonnes. As-tu lancé la macro une première fois ? Elle supprime également les précédentes données avant de coller les nouvelles, donc comme tu n'avais pas le fichier d'origine, il n'y avait pas de nouvelles données.

Si tu re-télécharge le fichier que j'ai posté, tu verras les données.

Mais peu importe finalement, tu as recréé exactement le type de données que j'avais. J'ai modifié ma macro pour correspondre mais je ne comprends pas, ça fonctionne sur ton fichier mais pas sur le mien... j'ai vérifié chaque étape une à une pourtant.

Lorsque je choisi un code produit, les lignes sélectionnées auparavant sont effacées et aucune nouvelle ligne s'affiche.

image

Je t'envoie de nouveau mon fichier avec les modification apportées.

Merci

Quentin

8suivi-lot.xlsm (170.86 Ko)

Bonjour,

Exact, je n'ai pas fais attention qu'une procedure vidait la liste en BDD

Pour mon exemple, ça fonctionne car le code produit est reconnu comme un texte, chez toi c'est le cas juste pour les dernier codes produit "TEST".

Essai comme ça [If CBproduit.Value = Trim(Cells(ligne, 1).Value)]

Private Sub CBproduit_Change()
Sheets("BDD").Select

CBligne.Clear
ligne = 2
Do While Cells(ligne, 2).Value <> ""
    If CBproduit.Value = Trim(Cells(ligne, 1).Value) Then
        Formulaire.CBligne.AddItem Cells(ligne, 2).Value
    End If
    ligne = ligne + 1
Loop

Dim k As Integer
Dim l As Integer
    If CBligne.ListCount < 2 Then Exit Sub
    For k = 0 To CBligne.ListCount - 1
        For l = k + 1 To CBligne.ListCount - 1
            If CBligne.ListCount = l Then Exit For
            If CBligne.List(k) = CBligne.List(l) Then
                CBligne.RemoveItem l
                l = l - 1
            End If
        Next l
    Next k

End Sub

Tu peux le voir si tu fais :

Debug.Print CBproduit.Value
Debug.Print Cells(ligne, 1).Value
image

A+

Ca fonctionne parfaitement, merci beaucoup pour ton aide !

Rechercher des sujets similaires à "userform liste deroulante dependante"