Filtre Listview Multi-critères Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
J
JS Lombard
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 17 mars 2015
Version d'Excel : 2010 FR

Message par JS Lombard » 4 novembre 2015, 16:47

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
J
JS Lombard
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 17 mars 2015
Version d'Excel : 2010 FR

Message par JS Lombard » 4 novembre 2015, 22:37

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
Avatar du membre
Banzai64
Fanatique d'Excel
Fanatique d'Excel
Messages : 16'690
Appréciations reçues : 5
Inscrit le : 21 novembre 2010
Version d'Excel : 2003 FR (learning 2010 - 2013)

Message par Banzai64 » 4 novembre 2015, 22:50

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

J
JS Lombard
Jeune membre
Jeune membre
Messages : 13
Inscrit le : 17 mars 2015
Version d'Excel : 2010 FR

Message par JS Lombard » 4 novembre 2015, 23:09

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 !
s
salhi_haithem
Jeune membre
Jeune membre
Messages : 25
Inscrit le : 29 mars 2015
Version d'Excel : 2007 FR

Message par salhi_haithem » 3 décembre 2015, 11:37

Merci Pour Le Code
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message