Filtrer listview

Résolu
Bonjour, je cherche a optimiser un code qui filtre une listview,je veux le rendre moins long, le code et le suivant:
  Dim Item As ListItem
 Dim DerniereLigne As Long
 Dim I As Long

 Me.ListView1.ListItems.Clear
 DerniereLigne = Worksheets("Clients").Cells(Rows.Count, 2).End(xlUp).row
 
 With Me.ListView1
 
 For I = 7 To DerniereLigne
 
  If Me.Txt_filtres_client = "Type" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 5), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)
        
        
   Else
                   
 
 End If
 
  ElseIf Me.Txt_filtres_client = "Code" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 6), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)
   
   Else
   
 End If
 
 
    ElseIf Me.Txt_filtres_client = "Nom et prénom" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 9), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)

Else
    End If
    
        ElseIf Me.Txt_filtres_client = "Adresse" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 10), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)
     
     Else
     
    End If

       ElseIf Me.Txt_filtres_client = "Ville" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 12), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)
      
      Else
      
    End If
    
       ElseIf Me.Txt_filtres_client = "Code Postal" Then
  If LCase$(Left$(Worksheets("Clients").Cells(I, 11), Len(Me.Txt_valeur_client))) = LCase$(Me.Txt_valeur_client) Then
  
        .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 4)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 5)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 6)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 9)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 10)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 12)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 11)
        .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)

      Else
      
    End If
    
    
End If
    
 Next I
 
End With

Merci deja pour votre aide,cordialement JSCH19!!

4 réponses

Résumé de la discussion

Le fil porte sur l’optimisation d’un code VBA filtrant une ListView selon un critère sélectionné dans un combobox et une valeur saisie, pour réduire la longueur et la répétition du script. Des propositions soulignent que le code actuel répète systématiquement les mêmes opérations pour les cas Type, Code, Nom et prénom, Adresse, Ville et Code Postal, ce qui complexifie la maintenance. Les réponses préconisent de regrouper les conditions dans une sub ou d’utiliser une seule condition avec des opérateurs And/Or, afin d’alléger le bloc et d’assurer une cohérence des colonnes. D’autres points évoqués portent sur l’alignement des en-têtes (problème récurrent de ligne affichant les en-têtes), le filtrage dynamique versus un bouton, et la gestion des saisies vides.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour,
    les actions à faire sont toujours les mêmes?
    tu peux alors les regrouper dans une sub, ou bien faire un seul if avec des
    and
    et des
    or
    .
    à choisir en fonction de ce qui te semble le plus clair.
    0
    1. Bonjour yg_be les actions sont toujours les mêmes.
      0
    2. J’ai essayé de le faire mais cela n’a pas fonctionné.
      0
  2. Bonjour a vous deux,

    A essayer

    Sub test()
        Dim Item As ListItem
        Dim DerniereLigne As Long
        Dim lig As Long
        
         Me.ListView1.ListItems.Clear
         With Me.ListView1
            If Me.Txt_filtres_client = "Type" Then
                Col = 5
            ElseIf Me.Txt_filtres_client = "Code" Then
                Col = 6
            ElseIf Me.Txt_filtres_client = "Nom et prénom" Then
                Col = 9
            ElseIf Me.Txt_filtres_client = "Adresse" Then
                Col = 10
            ElseIf Me.Txt_filtres_client = "Ville" Then
                Col = 12
            ElseIf Me.Txt_filtres_client = "Code Postal" Then
                Col = 11
            Else
            End If
            Nb = Application.CountIf(Worksheets("Clients").Columns(Col), Me.Txt_valeur_client & "*")
            If Nb > 0 Then
                lig = 1
                For n = 1 To Nb
                    lig = Worksheets("Clients").Columns(Col).Find(Txt_valeur_client, Cells(lig, Col), , xlPart).Row
                    .ListItems.Add , , Text:=Worksheets("Clients").Cells(I, 2)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 4)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 5)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 6)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 9)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 10)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 12)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 11)
                    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(lig, 21)
                Next n
            End If
        End With
    End Sub
    0
    1. Bonjour,merci d'avoir pris votre temps pour effectuer ce travail titanesque ,merci encore!!!
      j''ai testé le code,il marche a merveille mais les inconvenients c'est que si tu rentres la premiere lettre d'un mot pour filtrer la colonne alors les en-tetes des colonnes apparaient encore sur une ligne en dessous des en-tetes,puis je vois que tu as oublié de nommer des variables qui sont les suivants:
      "col","n","nb" mais je les ai definit pour lancer le code,autre probleme qu'il y a, lorsque Me.Txt_valeur_client=empty donc le tableau se vide mais dans le code precedent le tableau restait remplis pour permettre a l'utilisateur de mieux orienter sa recherche ou filtre.

      Cordialement JSCH19
      0
    2. Voila un exemple:
      0
  3. Bonjour,

    Je regarde la chose. Vu que je n'ai pas creer de fichier pour ce code, donc pas tester.
    Un exemple de votre fichier aurait ete le bienvenu

    le tableau restait remplis
    Ben oui, mais facile a resoudre, c'est dans le code, une ligne a deplacer

    Les entetes de colonne sont a quelle ligne?
    Donc une ligne de code a inserer apres la ligne For........, pour tester que lig est superieur a cette ligne
    0
    1. @JSCH19Bonjour,

      Ca, j'apprecie pas trop

      0
    2. @f894009J’avais oublié d’autoriser l accès a tout le monde mais maintenant c’est fait. Pour travailler avec le fichier il serait préférable de le télécharger.
      0
  4. Re,

    Y a un probleme entre les entetes de colonne et les entetes de la listview
    Pas le bon nombre de colonnes feuille
    .ListItems(.ListItems.Count).ListSubItems.Add , , Worksheets("Clients").Cells(I, 21)
    
    1
    1. Peut-être une erreur. Donc tu as pu tester le code
      0
    2. @f894009Merci infiniment!! mais le probleme persiste toujours ou le tableau reste rempli si UserForm1.Txt_valeur_client=empty. Une fois le tablau aura plein de donnees puis tu fais un filtre si le tableau se vide il faudra retourner en arriere pour actualiser les donnees du tableau.
      0
    3. @JSCH19Re,
      vous vous etes pas penché sur ce cas.pourquoi
      Pouvez relire votre post<5>
      0
    4. @f894009Désolé pour ma réponse ... Retournons au vif du sujet j’ai testé le fichier tout marche parfaitement mais il reste un petit détail,permettre au tableau de garder ses données si UserForm1.txt_valeur_client est vide
      0