Filltre multi-critère dans une listView - Excel VBA

Bonjour à tous,

J'ai besoin d'aide pour corriger ma procédure de filtre dans une listview.

En effet j'ai 8 Comboboxs à partir desquelles je veux lancer ma procédure de filtre c'est à dire:

Ma Combobox1 Filtrée m'affiche des données dans ma combobox2 et dans la listview selon le filtre ainsi de suite jusqu'au 8ème combobox.

J'ai fait en ma manière pour obtenir un résultat qui n'ai pas satisfaisant.

Le premier filtre avec la Combobox1 fonctionne très bien, par contre avec les autres combobox ca ne marche pas car surtout avec la 3ème combobox, rien ne s'affiche dans ma Listview.

Code du Filtre

Sub Filtrer(P As Byte)
C = Feuil2.Range("B7:P" & Feuil2.Range("B1048576").End(xlUp).Row).Value
    With Registre_Pr.Registre
    .ListItems.Clear

For i = 1 To UBound(C, 1)
    If CStr(C(i, P)) = Registre_Pr.Controls("ComboBox" & P) Then
    .ListItems.Add , , CDate(C(i, 1))
    Lg = .ListItems.Count

    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 2), "Mm")
    .ListItems(Lg).ListSubItems.Add , , C(i, 3)
    .ListItems(Lg).ListSubItems.Add , , C(i, 4)
    .ListItems(Lg).ListSubItems.Add , , C(i, 5)
    .ListItems(Lg).ListSubItems.Add , , C(i, 6)
    .ListItems(Lg).ListSubItems.Add , , C(i, 7)
    .ListItems(Lg).ListSubItems.Add , , C(i, 8)
    .ListItems(Lg).ListSubItems.Add , , C(i, 9)
    .ListItems(Lg).ListSubItems.Add , , C(i, 10)
    .ListItems(Lg).ListSubItems.Add , , C(i, 11)
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 12), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 13), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 14), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 15), "# ### ### CFA")

End If
Next i
End With
End Sub

Code pour Combobox1

ComboBox2.Clear
ComboBox3.Clear
ComboBox4.Clear
ComboBox5.Clear
ComboBox6.Clear
ComboBox7.Clear
ComboBox8.Clear

Set S = CreateObject("Scripting.Dictionary")
For Lg = 1 To UBound(C)
If CStr(C(Lg, 1)) = ComboBox1.Value Then S(C(Lg, 2)) = ""
Next Lg
ComboBox2.List = S.keys
Filtrer (1)

Code pour Combobox2

ComboBox3.Clear
ComboBox4.Clear
ComboBox5.Clear
ComboBox6.Clear
ComboBox7.Clear
ComboBox8.Clear

Set S = CreateObject("Scripting.Dictionary")
For Lg = 1 To UBound(C)
If CStr(C(Lg, 2)) = ComboBox2.Value Then S(C(Lg, 4)) = ""
Next Lg
ComboBox3.List = S.keys
Filtrer (2)

Code pour Combobox3

ComboBox4.Clear
ComboBox5.Clear
ComboBox6.Clear
ComboBox7.Clear
ComboBox8.Clear

Set S = CreateObject("Scripting.Dictionary")
For Lg = 1 To UBound(C)
If CStr(C(Lg, 4)) = ComboBox3.Value Then S(C(Lg, 7)) = ""
Next Lg
ComboBox4.List = S.keys
Filtrer (3)

C'est le même code utilisé pour les autres comboboxs selon les lignes et colonnes.

Voici des images d'exécution du code.

1) La procédure marche très bien avec le filtre de ma première combobox (Voir Image 1)

1

2) Avec la deuxième combobox le filtre initialise tous les données du mois pourtant je voulais que ce soit uniquement les données de la date de la première combobox au mois du filtre 2 (Voir Image 2)

2

3) Avec la Combobox 3 rien ne s'affiche du tout pourtant dans l'image 1 vous voyez bien qu'il y'a bien des données (d'impression) (Voir Image 3)

3

Merci de me guider et merci pour votre bonne collaboration

Hello,

Une piste sur les 3 premières combo :

Sub combo1modifcode()
    filtre "valeurCombo1"
End Sub
Sub combo2modifcode()
    filtre "valeurCombo1", "valeurCombo2"
End Sub
Sub combo3modifcode()
    filtre "valeurCombo1", "valeurCombo2", "valeurCombo3"
End Sub

Sub filtre(ParamArray ValeurCombo() As Variant)

    ' En fonction de la combobox modifiée
    Select Case UBound(ValeurCombo)

        ' Si 1 valeur passée en parametre alors combobox1 est modifié
        Case Is = 0
            ' ici code qui alimente la listview sur 1 critere (celui combo1)

        ' Si 2 valeurs passées en parametre alors combobox2 est modifié
        Case Is = 1
            '  ici code qui alimente la listview sur 2 criteres (celui combo1+ combo2)

        '  Si 3 valeurs passées en parametre alors combobox3 est modifié
        Case Is = 2
         ' ici code qui alimente la listview sur 3 criteres (celui combo1+ combo2+combo3)

    End Select

End Sub

Je ne m'en sort pas vraiment. Ne m'en voulez pas vraiment je suis un débutant

En d'autres termes est-ce que je dois faire dans mon code ? :

Sub Filtrer(ParamArray Combobox() As Variant)

    Select Case UBound(ComboBox1)

        Case Is = 0
        Case Is = 1
        Case Is = 2
        Case Is = 3
        Case Is = 4
        Case Is = 5
        Case Is = 6
        Case Is = 7

    End Select
End Sub
Private Sub ComboBox1_Change()

Filtrer ComboBox1
End Sub

Private Sub ComboBox2_Change()

Filtrer ComboBox1, ComboBox2

End Sub

Private Sub ComboBox3_Change()

Filtrer ComboBox1, ComboBox2, ComboBox3

End Sub

Private Sub ComboBox4_Change()

Filtrer ComboBox1, ComboBox2, ComboBox3, ComboBox4

End Sub

Private Sub ComboBox5_Change()

Filtrer ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5

End Sub

Private Sub ComboBox6_Change()

Filtrer ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6

End Sub

Private Sub ComboBox7_Change()

Filtrer ComboBox1, ComboBox2, ComboBox3, ComboBox4, ComboBox5, ComboBox6, ComboBox7

End Sub

Hello,

Oui c'est preque ça :

je me suis arreté aux 2 premières

evenement change de la combobox :

Private Sub ComboBox1_Change()

Filtrer ComboBox1.value
End Sub

Private Sub ComboBox2_Change()

Filtrer ComboBox1.value, ComboBox2.value

End Sub

Procedure Filtrer :

Sub Filtrer(ParamArray Combobox() As Variant)

    Select Case UBound(ComboBox)

        Case Is = 0
' Ici cas filtre uniquement sur combobox1
' rajouter le code qui va filtrer le tableau dans excel  avec uniquement la combobox1 en filtre+ restitution dans la listview 
        Case Is = 1
' Ici cas filtre uniquement sur combobox1 + combobox 2
' rajouter le code qui va filtrer le tableau dans excel  avec uniquement la combobox1 + combobox2 en filtre+ restitution dans la listview 

' idem pour les autres combobox ...

    End Select
End Sub

si le ton code fonctionne sur la premiere combobox, ça donnerai ça pour la premiere combo :

Sub Filtrer(Paramarray combobox() as variant)

select case ubound(combobox)

case = 0 

C = Feuil2.Range("B7:P" & Feuil2.Range("B1048576").End(xlUp).Row).Value
    With Registre_Pr.Registre
    .ListItems.Clear

For i = 1 To UBound(C, 1)
    If CStr(C(i, P)) = Registre_Pr.Controls("ComboBox" & P) Then
    .ListItems.Add , , CDate(C(i, 1))
    Lg = .ListItems.Count

    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 2), "Mm")
    .ListItems(Lg).ListSubItems.Add , , C(i, 3)
    .ListItems(Lg).ListSubItems.Add , , C(i, 4)
    .ListItems(Lg).ListSubItems.Add , , C(i, 5)
    .ListItems(Lg).ListSubItems.Add , , C(i, 6)
    .ListItems(Lg).ListSubItems.Add , , C(i, 7)
    .ListItems(Lg).ListSubItems.Add , , C(i, 8)
    .ListItems(Lg).ListSubItems.Add , , C(i, 9)
    .ListItems(Lg).ListSubItems.Add , , C(i, 10)
    .ListItems(Lg).ListSubItems.Add , , C(i, 11)
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 12), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 13), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 14), "# ### ### CFA")
    .ListItems(Lg).ListSubItems.Add , , Format(C(i, 15), "# ### ### CFA")

End If
Next i
End With

case 1 
' meme code mais en ajoutant la condition de la combobox 2 

end select
End Sub

Merci énormément. Je vais essayer ce code à la première heure demain. Et en cas de soucis je vous reviendrai.

Merci énormément encore. 🙏

Rag02700

Hello, je vous espère bien portant.

Merci beaucoup pour tous ce que vous avez fait pour moi jusqu'ici. Je vous en saurai gré.

Malheureusement pour moi j'ai essayé votre code mais ça ne fonctionne qu'avec ma combobox 2.

Veuillez trouver ci-joint un fichier exemple avec votre code, il pourrait vous servir pour comprendre mieux ma préoccupation

Merci encore.

9classeur3.xlsm (44.59 Ko)

Hello,

j'ai fais l'exercice sur les 3 premières, il faut faire le même principe sur les autres

18classeur3.xlsm (43.12 Ko)

Hello!

Rag02700

Merci beaucoup pour tout.

J'ai essayé le code avec les les autres combobox, ça marche parfaitement comme je le souhaitais.

Encore merci. Dieu vous bénisse pour le service rendu.

Rechercher des sujets similaires à "filltre multi critere listview vba"