Excel vba - filtrer le contenu d'une listview

Soyez le premier à donner votre avis sur cette source.

Vue 30 022 fois - Téléchargée 3 252 fois

Description

Voici une petite démo qui vous permettra de filtrer "on the fly" le contenu d'une listview, en sélectionnant au préalable le champ sur lequel le filtre doit être appliqué. Enjoy !

Source / Exemple :


Option Explicit

Private Sub TextBox1_Change()
    Call LVW_Fill(Trim$(TextBox1.Text), ComboBox1.ListIndex)
End Sub

Private Sub UserForm_Activate()
    Me.Caption = "Historique des commandes"
    Set ListView1.Icons = ImageList1
    Set ListView1.SmallIcons = ImageList1
    Call CBO_Fill
    Call LVW_Fill("", 0)
End Sub

Private Sub CBO_Fill()
    'Variables locales
    Dim iCnt As Integer
    Dim oRng As Excel.Range

    'Remplit la Combo
    Set oRng = Feuil1.Cells(1, 1)
    For iCnt = 0 To 13 '-- 14 colonnes
        ComboBox1.AddItem oRng.Offset(0, iCnt)
    Next iCnt
    ComboBox1.ListIndex = 0
End Sub

Private Sub LVW_Fill(ByVal sFilter As String, ByVal iCol As Integer)
    'Variables locales
    Dim iCnt As Integer
    Dim iRnd As Integer
    Dim oRng As Excel.Range
    Dim oItem As ListItem

    'Initialisation de la ListView
    ListView1.ColumnHeaders.Clear
    ListView1.FullRowSelect = True
    ListView1.ListItems.Clear
    ListView1.View = lvwReport

    'Remplissage de la ListView
    Set oRng = Feuil1.Cells(1, 1)
    Do Until oRng.Offset(1, 0).Value = ""
        '-- En-têtes
        If oRng.Row = 1 Then
            For iCnt = 0 To 13 '-- 14 colonnes
                ListView1.ColumnHeaders.Add , , oRng.Offset(0, iCnt)
            Next iCnt
        '-- Données
        Else
            iRnd = Int((4 * Rnd) + 1)
            If LCase$(Left$(oRng.Offset(0, iCol), Len(sFilter))) = LCase$(sFilter) Then
                Set oItem = ListView1.ListItems.Add(, , oRng.Offset(0, 0), "Key" & iRnd, "Key" & iRnd)
                For iCnt = 1 To 14 '-- 14 colonnes
                    oItem.ListSubItems.Add , , oRng.Offset(0, iCnt)
                Next iCnt
            End If
        End If
        Set oRng = oRng.Offset(1, 0)
    Loop
End Sub

Conclusion :


Vous pouvez modifier cette source à volonté pour pouvoir la personnaliser. Toute question ou suggestion est la bienvenue.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_massi
Messages postés
28
Date d'inscription
mardi 18 mars 2003
Statut
Membre
Dernière intervention
31 janvier 2013

Bonsoir
quelle technique de programmation excelent.
SVP,
comment compter nombre de lignes filtrées
afficher le résultat dans un label
encore bravo pour ce progamme qui va servir toutes les personnes utilisant excl (vba)
merci
planetesud
Messages postés
6
Date d'inscription
mercredi 10 juin 2009
Statut
Membre
Dernière intervention
14 octobre 2019

Bonjour,
J'ai trouvé ce code super, mais je ne suis pas sure que l'on puisse encore ajouter des commentaires à cet endroit, je tente quand même.
Je suis débutante XXL en VBA et j'ai un problème.
J'ai remplacé la listbox par une combobox et j'ai rajouté 2 autres combobox, de façon à ce que l'utilisateur puisse filtrer selon 2 critéres en selectionnant la colonne à filtrer à l'aide des combo 1 et 3.
Mon problème est le suivant, je n'arrive pas à alimenter ma listview en combinant les 2 filtres, une question similaire avait été posée par "Robindesforets" et la réponse avait été "Tu testes ensuite quel est le nombre de critères utilisé par l'utilisateur puis tu intègres chaque couple combobox CHAMP et combobox CRITERE dans un clause WHERE pour filtrer ta listview"
Je ne comprends pas ce que je dois faire.
Quelqu'un pourrait-il m'aider SVP ?
D'avance merci.
Sandrine
hotus25
Messages postés
1
Date d'inscription
jeudi 18 décembre 2008
Statut
Membre
Dernière intervention
12 juillet 2010

Bonjour,

Tout d'abord je tiens à vous féliciter lesly_lodin car ce code est très utile!
Mais étant débutant j'ai un peu du mal à l'adapter à mon cas. Je souhaiterais que le filtre ne s'effectue pas sur le premier mot d'une phrase d'une colonne mais plutot sur n'importe quelle mot de la phrase.
Il faut modifier cette ligne je suppose If LCase$(Left$(oRng.Offset(0, iCol), Len(sFilter))) = LCase$(sFilter) Then
mais comment...

Merci pour toute aide.
cs_Gekco
Messages postés
20
Date d'inscription
mercredi 24 mars 2010
Statut
Membre
Dernière intervention
17 mai 2010

Bonjour,

Vraiment nickel de chez nickel ton code mais j'ai tout de même un petit soucis.
J'ai tenté tout bêtement d'adapter un peu en remplaçant ton textbox1 par une Combobox2 (puisque l'on est pas censé savoir parfois ce que l'on doit inscrire dans une textbox, bref). Seulement, j'obtiens des doublons. Alors pour les supprimer j'ai tenté ce code ci :

Private Sub ComboBox2_Change()
Call LVW_Fill(Trim$(ComboBox2.Text), ComboBox1.ListIndex)
End Sub
Private Sub ComboBox2_DropButtonClick()
'Variables locales
Dim iCnt2 As Integer
Dim i As Integer
Dim oRng2 As Excel.Range
Dim bAdd As Boolean

'Remplit la Combo
Set oRng2 = Feuil1.Cells(1, 1)
For iCnt2 = 1 To 800 '-- 800 lignes
For i = 0 To ComboBox2.ListCount - 1
If oRng2.Offset(iCnt2, 1).Text = ComboBox2.List(i) Then
bAdd = True
Exit For
End If
Next i
If bAdd = False Then ComboBox2.AddItem oRng2.Offset(iCnt2, 1)
Next iCnt2
End Sub

Mais ça ne marche pas bien et cela stop à la premiere donnée qu'il trouve en double. Comment puis-je régler cela au sein de ton code ?

Merci

PS: Sinon Bravo, il m'est d'une grande utilité
cs_Le Pivert
Messages postés
6526
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
13 février 2020
95
Félicitation LESLY_LODIN pour sur ce programme et j'ai une solution pour SHINPOO7:
Voici 2 sources qui feront peut_être son bonheur.
http://www.vbfrance.com/codes/LISTER-OUTLOOK-PARTIR-EXCEL_48091.aspx
http://www.vbfrance.com/codes/LISTVIEW_TRI_EXTENSIONS_50894.aspx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.