Filtre par 2 ComboBox sans doublons

Bonjour, j'ai créé un userform dans un premier fichier excel pour modifier un second fichier qui est partagé.

Sur cet userform, j'ai 6 ComboBox et 4 OptionButton.

Mes ComboBox1 et 2 doivent me servir de filtres.

Ce que je voudrais : lorsque j'ouvre mon userform,

ma ComboBox1 se charge avec le contenu de la colonne A de la feuille 1 (ça fonctionne)

je click sur une valeur qui filtre les lignes du tableau de la feuille 1 contenant cette valeur en colonne A

ma ComboBox2 se charge des valeurs de la colonne B de ces lignes

lorsque je clique sur une valeur de la ComboBox2, le résultat des colonnes C,D,E,F s'affiche dans les ComboBox3 à 6 et les OptionButton reprennent les valeurs des colonne G,H,I et J.

J'ai mis des ComboBox car je veux pouvoir les modifier en choisissant dans des listes de la feuille 2 qui sont chargées a l'ouverture.

Je joint un fichier Test pour la compréhension.

Mon problème pour l'instant est que la ComboBox2 ne se charge pas des lignes contenant la valeur de la ComboBox1.

23test.zip (26.80 Ko)

Bonjour Tophe, bonjour le forum,

Ton code modifié :

Option Explicit
Dim Ws As Worksheet, Ws2 As Worksheet
Dim BD() As Variant
Dim D As Object, I As Long, M As Long, N As Long, O As Long, P As Long

Private Sub UserForm_Initialize()
Workbooks.Open Filename:=ThisWorkbook.Path & "\BD.xlsx"
Set Ws = Sheets("Feuil1")
Set Ws2 = Sheets("Feuil2")

'Alimentation de la ComboBox1
BD = Ws.Range("A1").CurrentRegion
Set D = CreateObject("Scripting.Dictionary")
For I = 2 To UBound(BD)
    D(BD(I, 1)) = ""
Next I
Me.ComboBox1.List = D.keys
'Alimentation des ComboBox3 à 6
For M = 2 To Ws2.Range("A" & Rows.Count).End(xlUp).Row
    Me.ComboBox3.AddItem Ws2.Range("A" & M)
Next M
For N = 2 To Ws2.Range("B" & Rows.Count).End(xlUp).Row
    Me.ComboBox4.AddItem Ws2.Range("B" & N)
Next N
For O = 2 To Ws2.Range("C" & Rows.Count).End(xlUp).Row
    Me.ComboBox5.AddItem Ws2.Range("C" & O)
Next O
For P = 2 To Ws2.Range("D" & Rows.Count).End(xlUp).Row
    Me.ComboBox6.AddItem Ws2.Range("D" & P)
Next P
End Sub

Private Sub ComboBox1_Click()
Me.ComboBox2.Clear
Set D = CreateObject("Scripting.Dictionary")
For I = 2 To UBound(BD, 1)
    If CStr(BD(I, 1)) = Me.ComboBox1.Value Then D(BD(I, 2)) = ""
Next I
Me.ComboBox2.List = D.keys
End Sub

Private Sub ComboBox2_Change()
Dim J As Byte

For I = 3 To 6
    Me.Controls("ComboBox" & I).Clear
Next I
For I = 2 To UBound(BD, 1)
    If CStr(BD(I, 1)) = Me.ComboBox1.Value And CStr(BD(I, 2)) = Me.ComboBox2.Value Then
        For J = 3 To 6
            Me.Controls("ComboBox" & J) = BD(I, J)
        Next J
        Me.OptionButton1.Value = IIf(BD(I, 7) = Me.OptionButton1.Caption, True, False)
        Me.OptionButton2.Value = IIf(BD(I, 7) = Me.OptionButton2.Caption, True, False)
        Me.OptionButton3.Value = IIf(BD(I, 8) = Me.OptionButton3.Caption, True, False)
        Me.OptionButton4.Value = IIf(BD(I, 8) = Me.OptionButton4.Caption, True, False)
        Me.OptionButton5.Value = IIf(BD(I, 9) = Me.OptionButton5.Caption, True, False)
        Me.OptionButton6.Value = IIf(BD(I, 9) = Me.OptionButton6.Caption, True, False)
        Me.OptionButton7.Value = IIf(BD(I, 10) = Me.OptionButton7.Caption, True, False)
        Me.OptionButton8.Value = IIf(BD(I, 10) = Me.OptionButton8.Caption, True, False)
    End If
Next I
End Sub

Private Sub CommandButton1_Click()
Dim Ligne As Long

If Me.ComboBox1.ListIndex = -1 Then Exit Sub
If Me.ComboBox2 = "" Then
    MsgBox "Veuillez sélectionner la colonne 2"
    Exit Sub
End If
If MsgBox(" Confirmez-vous l’insertion de ce nouvel enregistrement ? ", vbYesNo, " Demande de confirmation d’ajout ") = vbYes Then
    Ligne = Me.ComboBox1.ListIndex + 2
    Ws.Range("C" & Ligne) = Me.ComboBox3
    Ws.Range("D" & Ligne) = Me.ComboBox4
    Ws.Range("E" & Ligne) = Me.ComboBox5
    Ws.Range("F" & Ligne) = Me.ComboBox6
    Ws.Range("G" & Ligne).Value = IIf(Me.OptionButton1.Value = True, "Oui", "Non")
    Ws.Range("H" & Ligne).Value = IIf(Me.OptionButton3.Value = True, "Oui", "Non")
    Ws.Range("I" & Ligne).Value = IIf(Me.OptionButton5.Value = True, "Oui", "Non")
    Ws.Range("J" & Ligne).Value = IIf(Me.OptionButton6.Value = True, "Oui", "Non")
End If
Range("A1").Select
ActiveWorkbook.Save
'ActiveWorkbook.Close
'Unload Me
End Sub

Bonjour ThauThème,bonjour tout le monde,

merci pour le code qui est complet.

Par contre j'ai un soucis, lorsque je fais un choix dans la combobox2 cela me vide les listes des combobox 3 à 6.

Donc je ne peux plus changer le choix.

Est-ce par rapport au code ComboBox2_Change ?

Re,

Ben oui !... Tu dis que "tu as créé" mais visiblement il n'en est rien si tu poses ce genre de question... On a tous débuté et à cette époque on n'étais vraiment pas doués (enfin, moi, c'était mon cas) mais quand j'écrivais un code je savais ce qu'il signifiait et sinon je ne me serais pas permis de dire que "j'avais créé"...

Re bonjour, merci pour la confirmation.

Quand j'ai écris "j'ai créé", j'ai aussi écrit "un UserForm", j'aurais pu écrire "j'ai construit".

Je n'ai pas eu la prétention ni d'écrire que j'étais un pro, ni que le code était de moi.

Etant débutant, j'ai récupéré des bouts de codes sur les forums que j'essaye de comprendre et d'adapter en lisant le cours de Philippe Lasserre en parallèle, mais il n'explique pas tout.

Alors comment comprendre l'erreur sans être sur d'ou elle vient ?

Merci encore pour le temps passé à m'aider, je vais retourner à mes recherches.

Re,

On est bien plus attentifs avec des personnes qui disent je débute en VBA qu'avec celles qui disent j'ai créé car on imagine que leur connaissance du VBA est supérieure.

Dans le code ComboBox2_Change, supprime ces trois lignes :

For I = 3 To 6
    Me.Controls("ComboBox" & I).Clear
Next I

Bonjour ThauThème, oui je l'ai compris hier soir en lisant le cours VBA sur les contrôles de ce site qui explique plus simplement pour moi que celui de Philippe Lasserre. Merci encore pour le temps passé à répondre à nos question.

Rechercher des sujets similaires à "filtre combobox doublons"