Filtre Listview Multi-critères
Bonjour à tous,
Je planche depuis un moment sur une procédure qui me permet de filtrer une listview, avec des critères multiples.
C'est une procédure que j'appelle dans différents évènements (en particulier TextBox_BeforUpdate) qui me permet de filtrer automatiquement ma listview en fonction des saisies de l'utilisateur.
Vous trouverez ci-dessous mon code actuel, qui fonctionne, mais pas exactement comme je le souhaite !
En effet, je voudrais que les filtres correspondent EXACTEMENT aux saisies de l'utilisateur. C'est à dire qu'à la place de Like "*" & Filtre & "*" , je voudrais : Like Filtre.
Le problème, c'est qu'avec ce code, les textbox qui servent de filtres étant vides à l'initialisation du formulaire, le programme me renvoie une erreur "Index out of bounds" : Logique !
La question : Comment faire pour laisser des TextBox vides lors de la saisie, tout en rendant les filtres exacts.
Je ne suis pas sûr d'être très clair, donc si j'ai réussi à me faire comprendre et que vous avez des pistes, je suis preneur. Et si vous avez des questions, n'hésitez pas !
Merci d'avance !
Sub FiltreGesPal(FiltreClients As String, FiltreST As String, FiltreProduits As String, FiltreUsers As String, FiltreDateDeb As Long, FiltreDateFin As Long)
Dim i As Long, lCount As Long
With USFGesPal.ListView1
lCount = .ListItems.Count
If lCount = 0 Then Exit Sub
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(4).Text Like "*" & FiltreClients & "*" _
Or Not .ListItems(i).ListSubItems(5).Text Like "*" & FiltreST & "*" _
Or Not .ListItems(i).ListSubItems(3).Text Like "*" & FiltreProduits & "*" _
Or Not .ListItems(i).ListSubItems(12).Text Like "*" & FiltreUsers & "*" _
Or Not CDec(CDate(.ListItems(i).ListSubItems(2).Text)) >= FiltreDateDeb _
Or Not CDec(CDate(.ListItems(i).ListSubItems(2).Text)) <= FiltreDateFin Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End With
End Sub
Bonjour à tous,
J'ai trouvé la solution... Même si je ne la trouve pas très propre. Enfin si cela peut aider quelqu'un à l'occasion :
Sub FiltreGesPal(FiltreSage As String, FiltreClients As String, FiltreST As String, FiltreProduits As String, FiltreUsers As String, FiltreDateDeb As Long, FiltreDateFin As Long)
Dim i As Long, lCount As Long
With USFGesPal.ListView1
lCount = .ListItems.Count
If FiltreClients <> "" Then
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(4).Text Like FiltreClients Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End If
If FiltreST <> "" Then
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(5).Text Like FiltreST Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End If
If FiltreProduits <> "" Then
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(3).Text Like FiltreProduits Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End If
If FiltreUsers <> "" Then
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(12).Text Like FiltreUsers Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End If
End With
End Sub
Bonsoir
A tester
Sub FiltreGesPal(FiltreClients As String, FiltreST As String, FiltreProduits As String, FiltreUsers As String, FiltreDateDeb As Long, FiltreDateFin As Long)
Dim i As Long, lCount As Long
If FiltreClients = "" Then FiltreClients = "*"
If FiltreST = "" Then FiltreST = "*"
If FiltreProduits = "" Then FiltreProduits = "*"
If FiltreUsers = "" Then FiltreUsers = "*"
With USFGesPal.ListView1
lCount = .ListItems.Count
If lCount = 0 Then Exit Sub
For i = 1 To lCount
If i > lCount Then Exit For
If Not .ListItems(i).ListSubItems(4).Text Like FiltreClients _
Or Not .ListItems(i).ListSubItems(5).Text Like FiltreST _
Or Not .ListItems(i).ListSubItems(3).Text Like FiltreProduits _
Or Not .ListItems(i).ListSubItems(12).Text Like FiltreUsers _
Or Not CDec(CDate(.ListItems(i).ListSubItems(2).Text)) >= FiltreDateDeb _
Or Not CDec(CDate(.ListItems(i).ListSubItems(2).Text)) <= FiltreDateFin Then
.ListItems.Remove (i)
i = i - 1
lCount = lCount - 1
End If
Next i
End With
End Sub
Bonsoir Banzai 64,
Il fallait y penser ! Ca marche PARFAITEMENT !
Tu as résolu une journée de prise de tête en 4 lignes de code, c'est beau !
Merci beaucoup !
Merci Pour Le Code