Userform, Liste déroulante dépendante sans doublon
#1
Débutant XLPages

Inscription: 25/01/2021
De France

Messages: 3

Système d'exploitation:
pc
Version Excel utilisée:
365
Posté le : 25-01-2021 11h15

Bonjour,

Je débute en VBA, pour progresser, je cherche à réaliser un formulaire, cependant je rencontre un blocage pour lier les listes déroulantes. 

La 1ére liste = L_TC qui dépendant de la liste en colonne H 

La 2éme liste = T_Tiers elle affiche la colonne J sans doublon

Maintenant je chercher à lié la liste T_Tiers au résultat de la selection de la 1ére liste L_TC le lien étant effectué colonne J. 

 

Private Sub Fermer_click()
    Unload Me
End Sub


Private Sub UserForm_Initialize()
  Set P = Sheets("P")
  Me.L_TC.List = P.Range("H3:H" & P.[H2500].End(xlUp).Row).Value
  
  Set mondico = CreateObject("Scripting.Dictionary")
  a = P.Range("j2:j" & P.[j5000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
  For i = LBound(a) To UBound(a)
   If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
  Next i
  'Me.L_Tiers.List = MonDico.keys
  '--avec tri
  temp = mondico.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.L_Tiers.List = temp
  Me.L_Cat.List = P.Range("k2:k" & P.[k2500].End(xlUp).Row).Value
  Me.L_Comptes.List = P.Range("l2:q" & P.[q2500].End(xlUp).Row).Value
End Sub
Sub Tri(a, gauc, droi)          ' Quick sort
 ref = a((gauc + droi) \ 2)
 g = gauc: d = droi
 Do
     Do While a(g) < ref: g = g + 1: Loop
     Do While ref < a(d): d = d - 1: Loop
     If g <= d Then
       temp = a(g): a(g) = a(d): a(d) = temp
       g = g + 1: d = d - 1
     End If
 Loop While g <= d
 If g < droi Then Call Tri(a, g, droi)
 If gauc < d Then Call Tri(a, gauc, d)
End Sub



Je vous joins mon fichier. 

Bien à vous
Théo


 

Pièce jointe:
xlsm P.xlsm   [ Taille: 44.70 Ko - Téléchargements: 269 ]
Edité par Theo44 le 25/01/2021 17:28:43
Hors Ligne
Rapport   Haut 

Re: Userform, Liste déroulante dépendante sans doublon
#2
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 26-01-2021 17h22

Bonjour Théo, et bienvenue sur mDF-XLpages.com Content(e)



Maintenant je chercher à lié la liste T_Tiers au résultat de la selection de la 1ére liste L_TC le lien étant effectué colonne J.


A vrai dire, je n'ai pas compris ce que tu entends par "lier la liste T_Tiers au résultat de la selection de la 1ère liste L_TC"... "le lien étant effectué colonne J"


Je pense que le mieux serait que tu cites un ou plusieurs exemples complets, par exemple :

  • si je sélectionne "Stock" dans la liste L_TC
  • alors je devrais obtenir... dans la liste T_Tiers ou autre... etc

Sinon, ce n'est pas facile de comprendre exactement ce que tu cherches à faire...


Par ailleurs, j'ai vu que tu avais nommé les plages de tes listes sur la page P, mais visiblement, tu ne t'en sers pas dans ton code VBA. C'est voulu ?

Peut-être que ces plages nommés sont variables et vont évoluées dans le temps ?


Bien cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Userform, Liste déroulante dépendante sans doublon
#3
Débutant XLPages

Inscription: 25/01/2021
De France

Messages: 3

Système d'exploitation:
pc
Version Excel utilisée:
365
Posté le : 26-01-2021 21h01

Bonjour Didier,


Merci pour ton accueil et ton retour  ,

 


A vrai dire, je n'ai pas compris ce que tu entends par "lier la liste T_Tiers au résultat de la sélection de la 1ère liste L_TC"... "le lien étant effectué colonne J"

 

Pour expliquer simplement, à partir de la valeur sélectionnée dans la liste L_TC (Plage "L_TC"), je souhaite voir afficher la liste des tiers (Plage "L_Tiers") qui y répondent. (critère étant dans la plage "V_TC")
 

 


 

exemple 1                           exemple 2

L_TC     =   Charge              L_TC = Produit

L_Tiers                                L_Tiers

4.0.1.1.1_Microsoft             4.1.1.99_Clients_Divers

4.0.1.1.2_OVH

4.0.1.1.3_K2-Système

4.0.1.1.4_Citroën

4.0.1.1.5_Rexcel

4.0.1.1.6_Panasonic

4.0.1.1.5_SMA

4.0.1.1.8_Expert_Comptable

4.0.4.1.1_Rexcel

4.0.4.1.2_LDLC

 

Par ailleurs, j'ai vu que tu avais nommé les plages de tes listes sur la page P, mais visiblement, tu ne t'en sers pas dans ton code VBA. C'est voulu ?

 

Il s'agit d'un non-choix, je ne connais pas la différente d'impact dans la rapidité de l'exécution du code, j'ai modifié le fichier en conséquent ci-joint

Bien cordialement
Théo

Pièce jointe:
xlsm P1.xlsm   [ Taille: 47.22 Ko - Téléchargements: 270 ]
Edité par Theo44 le 28/01/2021 11:51:52
Hors Ligne
Rapport   Haut 

Re: Userform, Liste déroulante dépendante sans doublon
#4
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 28-01-2021 17h46

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,

 

Pièce jointe:
zip PourTheo44 - P1.zip   [ Taille: 37.91 Ko - Téléchargements: 397 ]

Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 

Re: Userform, Liste déroulante dépendante sans doublon
#5
Débutant XLPages

Inscription: 25/01/2021
De France

Messages: 3

Système d'exploitation:
pc
Version Excel utilisée:
365
Posté le : 29-01-2021 15h07

onjour Didier, 

Merci pour ton retour,

Effectivement je me suis aperçu que renommé chaque liste est contre productif,
J'ai trouvé sur un site un code bien expliquer: 
(Source: excel.developpez)

Option Explicit
 
Dim Ws As Worksheet
Dim NbLignes As Integer
 
 
Private Sub UserForm_Initialize()
    'Définit la feuille contenant les données
    Set Ws = Worksheets("P")
    'Définit le nombre de lignes dans la colonne A
    NbLignes = Ws.Range("I6000").End(xlUp).Row
 
    'Remplissage du ComboBox1
    Alim_Combo 1
 
End Sub
 
 
Private Sub ComboBox1_Change()
    'Remplissage Combo2
    Alim_Combo 2, ComboBox1.Value
End Sub
 
 
Private Sub ComboBox2_Change()
    'Remplissage Combo3
    Alim_Combo 3, ComboBox2.Value
End Sub
 
 
 
 
 
'Procédure pour alimenter les ComboBox
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
    Dim j As Integer
    Dim Obj As Control
 
    'Définit le ComboBox à remplir
    Set Obj = Me.Controls("ComboBox" & CbxIndex)
    'Supprime les anciennes données
    Obj.Clear
 
    'alimente le Combobox initial (Combobox1)
    If CbxIndex = 1 Then
        'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
        For j = 2 To NbLignes
            Obj = Ws.Range("I" & j)
            'Remplit le ComboBox sans doublons
            If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("I" & j)
        Next j
    Else
        'Alimentation conditionnelle des autres Combobox en fonction de
        'ce qui est sélectionnée dans le contrôle précédent :
        '(La sélection du ComboBox1 définit le contenu du ComboBox2,
        'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
        For j = 2 To NbLignes
            If Ws.Range("I" & j).Offset(0, CbxIndex - 2) = Cible Then
                Obj = Ws.Range("I" & j).Offset(0, CbxIndex - 1)
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("I" & j).Offset(0, CbxIndex - 1)
            End If
        Next j
   End If
 
   'Enlève la sélection dans le ComboBox
   Obj.ListIndex = -1
   

    Dim i As Integer
    Dim Plage As Range
    Set Plage = Range("T_Compte")
    With ListBox1
        .List() = Plage.Value
        .ColumnCount = Plage.Columns.Count
        For i = 1 To .ColumnCount
        Next
    End With
 
End Sub


Merci pour ton code je vais pouvoir m'en servir pour voir différentes méthodes pour un même résultat. 

Il ne me reste plus qu'a regrouper les colonnes L à Q dans la listbox1 qui dépend des combobox1,2,3


Merci pour ton article très instructif également, 

Bien cordialement,
Théo

Pièce jointe:
xlsm P2.xlsm   [ Taille: 47.88 Ko - Téléchargements: 336 ]
Hors Ligne
Rapport   Haut 

Re: Userform, Liste déroulante dépendante sans doublon
#6
Webmestre

Inscription: 18/05/2006
De Saône-et-Loire (71)

Messages: 1539

Système d'exploitation:
PC
Version Excel utilisée:
97, 2000, 2002, 2003, 2007, 2010, 2013, 2016 et 365
Posté le : 30-01-2021 01h37

Bonsoir Theo44, le Forum,

 

A mon tour de te remercier pour le partage de la solution que tu as trouvée (je mets le fil de discussions en "Résolu")

 

J'aime particulièrement la façon relativement simple d'aborder le remplissage de ComboBox sans doublon. C'est une autre méthode qui me semble très efficace et que je vais certainement garder en mémoire.

 

Mais ça n'a rien d'étonnant, car je crois que son auteur n'est autre que SilkyRoadMVP Excel il y a quelques années, c'est un ami que j'ai beaucoup apprécié et qui m'a fait l'honneur de quelques interventions ici même (sous son pseudo de l'époque MichelXLD).

 

Tout ça me rend bien nostalgique à vrai dire... et je regrette énormément que des interlocuteurs de valeur comme lui (et d'autres) aient complètement disparu des forums Exceliens depuis

 

Bien cordialement,


Didier_mDF
Image redimensionnée
Le Webmaster

La réponse vous satisfait ? Merci de revenir solder le sujet en [résolu], voir ce lien
Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes