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.
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.
Et l'affichage final obtenu (qui fonctionne parfaitement quand on sélectionne des codes compatibles), pour donner du contexte :
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
Bonjour,
Aucune donnée sur BDD, tu pourras trouver un nouvel Userform dans la feuille Exemple.
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.
Je t'envoie de nouveau mon fichier avec les modification apportées.
Merci
Quentin
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
A+
Ca fonctionne parfaitement, merci beaucoup pour ton aide !