Rapport de message :*
 

Re: Userform, Liste déroulante dépendante sans doublon

Titre du sujet : Re: Userform, Liste déroulante dépendante sans doublon
par myDearFriend! le 28/01/2021 17:46:03

Bonjour Theo44,

 

Tu trouveras en pièce jointe peut-être une façon de faire pour répondre à ton besoin.

 

J'ai tout d'abord créé la Function suivante :

 

DANS LE MODULE DE CODE DU USERFORM

Private Function defListeTiers(valTC As String) As Variant
' myDearFriend! - www.mdf-xlpages.com
Dim Dict As Object
Dim vTabTemp As Variant
Dim L As Long

    Set Dict = CreateObject("Scripting.Dictionary")
    'Mémorise les valeurs des plages "V_TC" et "L_TC_Tiers" (colonnes I et J) dans un seul tableau variant à 2 colonnes
    vTabTemp = Sheets("P").Range("V_TC").Resize(ColumnSize:=2).Value
    'On parcourt ligne à ligne le tableau variant
    For L = 1 To UBound(vTabTemp, 1)
        'Si correspondance avec le choix en Combobox "L_TC"
        If vTabTemp(L, 1) = valTC Then
            'On ajoute l'item au dictionary (sans doublon!)
            Dict(vTabTemp(L, 2)) = ""
        End If
    Next L
    'Si liste vide alors on sort de la fonction
    If Dict.Count = 0 Then Exit Function
    'On récupère la liste des items sans doublon
    vTabTemp = Dict.Keys
    Set Dict = Nothing
    ' On retourne la liste avec tri
    defListeTiers = Tri(vTabTemp, LBound(vTabTemp), UBound(vTabTemp))
End Function

 

Puis, j'ai aujouté une procédure évènementielle, laquelle est déclenchée par tout changement de valeur dans la liste de choix "Type contrat" :

 

Private Sub L_TC_Change()
Dim vTabTemp As Variant
    'Selon choix dans la liste "L_TC", on redéfinit la liste "L_Tiers"
    vTabTemp = defListeTiers(L_TC.Text)
    With L_Tiers.Style = fmStyleDropDownList
        .Clear
        If Not IsEmpty(vTabTemp) Then
            .List = vTabTemp
            .ListIndex = -1
        End If
    End With
End Sub

 

Attention cependant : pour être sûr que le fonctionnement soit fiable, il te faut impérativement modifier la propriété "Style" de tes ComboBox sur "fmStyleDropDownList" (qui n'est pas la valeur par défaut).

Ca permet d'obliger l'utilisateur à faire un choix existant dans la liste, et l'empeche de saisir une autre valeur non proposée.

C'est ce que j'ai fait pour tes 2 ComboBox "L_TC" et "L_Tiers".

 

J'ai tenté de commenter au maximum le code utilisé pour que tu puisses le comprendre au mieux.

 

Par ailleurs, (et j'aurai dû commencer par ça), je me permets 2 conseils concernant ton code  :

  1. - donner le même nom aux plages nommées et aux contrôles de ton Userform n'est pas la meilleure idée. Ca donne quelque chose d'assez confus dans le code, selon moi.
     
  2. - La déclaration des variables est toujours hautement recommandée ! Et l'utilisation de l'instruction "Option explicit" en tête de module est requise sans modération... (à l'occasion et si tu as envie d'en savoir plus, je te conseille cet article "VBA et les variables". Il demande certainement à être réactualisé, mais son contenu reste toujours valable à mon avis). J'ai d'ailleurs modifié légèrement ta procédure de Tri en conséquence.

 

En espérant que ça puisse t'inspirer pour la suite de ton projet...

 

Bien cordialement,