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 SubCode 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)
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)
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)
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 SubJe 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 SubPrivate 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 SubHello,
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 SubProcedure 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 Subsi 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 SubMerci é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.
Hello,
j'ai fais l'exercice sur les 3 premières, il faut faire le même principe sur les autres
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.