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

Rechercher des sujets similaires à "filtre listview multi criteres"