Filtre Multicriteres dans ListView avec TextBox
Bonjour,
J'ai un formulaire avec une ListView qui me permet d'extraire les données d'une BDD.
J'ai 3 TextBox qui me permettent d'effectuer un filtre.
Je voudrais pouvoir utiliser ces "filtres" en cascade. (J'y arrive avec une ListBox mais pas avec une ListView)
Function FilterDataInListView_Agence() 'Fonction Filter en fonction de la Textbox 24 (Agence de départ)
Dim i As Long
Dim searchText As String
Dim j As Long
searchText = LCase(TextBox24.Text)
On Error Resume Next
ListView1.ListItems.Clear
For i = 1 To Sheets("DATA").Cells(Rows.Count, 3).End(xlUp).Row
If InStr(1, LCase(Sheets("DATA").Cells(i, 3).Value), searchText) > 0 Then
With ListView1.ListItems.Add(, , Sheets("DATA").Cells(i, 1).Value)
For j = 2 To 18
.ListSubItems.Add , , Sheets("DATA").Cells(i, j).Value
Next j
End With
End If
Next i
End Function
Function FilterDataInListView_Contrat() 'Fonction Filter en fonction de la Textbox 25 (N° de Contrat)
Dim i As Long
Dim searchText As String
Dim j As Long
searchText = LCase(TextBox25.Text)
On Error Resume Next
ListView1.ListItems.Clear
For i = 1 To Sheets("DATA").Cells(Rows.Count, 4).End(xlUp).Row
If InStr(1, LCase(Sheets("DATA").Cells(i, 4).Value), searchText) > 0 Then
With ListView1.ListItems.Add(, , Sheets("DATA").Cells(i, 1).Value)
For j = 2 To 18
.ListSubItems.Add , , Sheets("DATA").Cells(i, j).Value
Next j
End With
End If
Next i
End Function
Function FilterDataInListView_Client() 'Fonction Filter en fonction de la Textbox 26 (Nom Client)
Dim i As Long
Dim searchText As String
Dim j As Long
searchText = LCase(TextBox26.Text)
On Error Resume Next
ListView1.ListItems.Clear
For i = 1 To Sheets("DATA").Cells(Rows.Count, 7).End(xlUp).Row
If InStr(1, LCase(Sheets("DATA").Cells(i, 7).Value), searchText) > 0 Then
With ListView1.ListItems.Add(, , Sheets("DATA").Cells(i, 1).Value)
For j = 2 To 18
.ListSubItems.Add , , Sheets("DATA").Cells(i, j).Value
Next j
End With
End If
Next i
End Function
Private Sub TextBox24_Change() ' Recherche par Agence
TextBox24.Text = UCase(TextBox24.Text)
Call FilterDataInListView_Agence
End Sub
Private Sub TextBox25_Change() ' Recherche par N° de Contrat
Call FilterDataInListView_Contrat
End Sub
Private Sub TextBox26_Change() ' Recherche Par NOM Client
TextBox26.Text = UCase(TextBox26.Text)
Call FilterDataInListView_Client
End SubBonjour,
Une solution pourrait etre de créer une variable intermédiaire contenant votre liste, et d'appliquer les filtres successivement sur cette variable, plutot que sur l'objet initial qui ne supporte qu'un filtre à la fois. En gros vous stockez le résultat intermédiaire après chaque filtrage dans une variable, et vous repartez de cette variable pour le prochain filtre.
Sinon, peut etre plus simple, vous pouvez avoir votre tableau dans Excel, et utiliser Range.AutoFilter method (Excel) | Microsoft Learn pour appliquer des filtres sur chaque colonne du tableau. Utilisez l'enregistreur automatique de macros et faites le manuellement, vous verrez c'est assez simple à adapter.
Une fois le résultat obtenu, vous l'appliquez dans votre listeview.