Filtrer listview
Résolu
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
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.
-
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)-
-
-
@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.
-
-
@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
-
-
Contributeurbonjour,
les actions à faire sont toujours les mêmes?
tu peux alors les regrouper dans une sub, ou bien faire un seul if avec desand
et desor
.
à choisir en fonction de ce qui te semble le plus clair. -
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-
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 -
-
-
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-
Voici le lien de mon fichier :
https://docs.google.com/spreadsheets/d/1Hx0ADPATuxp6Jq8lLih8ijOPkD1bPJtp/edit?usp=sharing&ouid=116706742648043221487&rtpof=true&sd=true
veuillez telecharger le fichier pour avoir pleinement acces a celui-ci. -
-
@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.
-
