(VBA) filtre BDD depuis choix Listbox

Hello le forum,

J'aimerai faire un filtre sur une feuille excel.

La particularité c'est que je veux que mes utilisateurs puissent faire une sélection multiple depuis une listbox.

Ils sélectionnent plusieurs éléments dans cette listbox et le filtre s'applique à ces éléments.

Donc mon idée c'est de récupérer ces éléments et les ajouter dans une variable TABLEAU(Array) et dans le critère de filtre insérer ce tableau. Mais je n'ai qu'une occurrence renvoyée

Pouvez-vous m'aider svp

Voici le code que j'utilise :

Merci à vous.

Sub Vision_Par_Compte(ListBox1 As Object)
Dim Ligne_En_Tete_Vivier As Byte, Colonne_Sourceur As Byte, Element_Liste As Byte
Dim Num As Integer
Dim Sourceur As String, Nom_Feuille_VIVIER As String
Dim Feuille_VIVIER As Worksheet
Dim Tablo()

'###########################################################################################
'~~~~~~~~~~~~~~~~ Variables à modifier si la structure change ~~~~~~~~~~~~~~~~~~~

'## Si la ligne de référence de l'en-tete du classeur VIVIER change, modifier cette variable ! ##
Ligne_En_Tete_Vivier = 10
'## Si l'en-tete de la colonne (TU/SU SOURCEUR) de référence change, modifier cette variable ! ##
Sourceur = "TU/SU sourceur"
'## Si la feuille de référence de ce classeur change, modifier cette variable ! ##
Nom_Feuille_VIVIER = "TDB_VIVIER"
'###########################################################################################

'Boucle sur les éléments de la Listbox (ListBox1 : nom à adapter)
For Element_Liste = 0 To ListBox1.ListCount - 1
'Si la ligne est sélectionnée (ListBox1 : nom à adapter)
    If ListBox1.Selected(Element_Liste) = True Then
'on redimensionne la var tablo, tout en en sauvegardant les valeurs
        ReDim Preserve Tablo(Num)
'on lui attribue l'élément sélectionné (ListBox1 : nom à adapter)
        Tablo(Num) = ListBox1.List(Element_Liste)
        Num = Num + 1
    End If
Next
'On definit la Feuille où le vivier est présent
Set Feuille_VIVIER = ThisWorkbook.Sheets(Nom_Feuille_VIVIER)
''On supprime le VIVIER existant
Colonne_Sourceur = Feuille_VIVIER.Rows(Ligne_En_Tete_Vivier).Find(What:=Sourceur, LookIn:=xlValues, lookat:=xlWhole).Column
'On enlève filtre et affiche les colonnes/lignes masquées
With Feuille_VIVIER.Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
On Error Resume Next
Feuille_VIVIER.ShowAllData
'On filtre sur le tableau
Feuille_VIVIER.Cells(Ligne_En_Tete_Vivier, Colonne_Sourceur).AutoFilter Field:=Colonne_Sourceur, Criteria1:=Tablo
End Sub

Salut,

J'ai testé le code suivant :

Sub Test()
    tablo = Array("1", "3", "4", "6")
    ActiveSheet.Range("$A$1:$A$8").AutoFilter Field:=1, Criteria1:=tablo, Operator:=xlFilterValues
End Sub

Ça fonctionne, donc l'idée de mettre tes critères dans un tableau de type Array est bonne.

Par contre sans ton classeur difficile de voir ce qui cloche.

Ta ListBox est située directement dans la feuille excel ou dans un Userform que tu appelles préalablement ?

Girodo,

Hello,

Merci pour ta réponse.

Elle est dans un USF, mais sur une feuille de calcul c'est mieux dans mon cas ... (Je pense jamais à utiliser les contrôles dans une feuille de calcul)

Pour moi c'est cette partie qui cloche mais je ne vois pas où ...

il faut peut-être ajouter des ";" ?

'Boucle sur les éléments de la Listbox (ListBox1 : nom à adapter)
For Element_Liste = 0 To ListBox1.ListCount - 1
'Si la ligne est sélectionnée (ListBox1 : nom à adapter)
    If ListBox1.Selected(Element_Liste) = True Then
'on redimensionne la var tablo, tout en en sauvegardant les valeurs
        ReDim Preserve Tablo(Num)
'on lui attribue l'élément sélectionné (ListBox1 : nom à adapter)
        Tablo(Num) = ListBox1.List(Element_Liste)
        Num = Num + 1
    End If
Next

Bonjour,

une variante récemment traitée

https://forum.excel-pratique.com/viewtopic.php?p=760479#p760479

l'idée est que l'userform renvoie les valeurs et que une macro en fasse un filtre avancé (on pourrait se passer en réalité de l'userform)

36test-forum.xlsm (284.02 Ko)

Un autre exemple sans userform (mais avec une sélection en cascade des paramètres de filtre)

Hello,

J'ai trouvé la solution

Il manquait simple ce bout de code à ma ligne de code du filtre pour avoir toutes les occurrences :

Operator:=xlFilterValues

Ce qui donne : (J'ai changé, j'utilise une Listbox incorporée à ma feuille de calcul) :

Sub Vision_Par_Compte()
Dim Ligne_En_Tete_Vivier As Byte, Colonne_Sourceur As Byte, Element_Liste As Byte
Dim Num As Integer
Dim Sourceur As String, Nom_Feuille_VIVIER As String
Dim Feuille_VIVIER As Worksheet
Dim Tablo()
Dim Boite_De_Liste As OLEObject

'###########################################################################################
'~~~~~~~~~~~~~~~~ Variables à modifier si la structure change ~~~~~~~~~~~~~~~~~~~

'## Si la ligne de référence de l'en-tete du classeur VIVIER change, modifier cette variable ! ##
Ligne_En_Tete_Vivier = 10
'## Si l'en-tete de la colonne (TU/SU SOURCEUR) de référence change, modifier cette variable ! ##
Sourceur = "TU/SU sourceur"
'## Si la feuille de référence de ce classeur change, modifier cette variable ! ##
Nom_Feuille_VIVIER = "TDB_VIVIER"
'###########################################################################################

'Boucle sur les éléments de la Listbox (ListBox1 : nom à adapter)
For Element_Liste = 0 To Feuil1.ListBox1.ListCount - 1
'Si la ligne est sélectionnée (ListBox1 : nom à adapter)
    If Feuil1.ListBox1.Selected(Element_Liste) = True Then
'on redimensionne la var tablo, tout en en sauvegardant les valeurs
        ReDim Preserve Tablo(Num)
'on lui attribue l'élément sélectionné (ListBox1 : nom à adapter)
        Tablo(Num) = Feuil1.ListBox1.List(Element_Liste)
        Num = Num + 1
    End If
Next
'On definit la Feuille où le vivier est présent
Set Feuille_VIVIER = ThisWorkbook.Sheets(Nom_Feuille_VIVIER)
''On supprime le VIVIER existant
Colonne_Sourceur = Feuille_VIVIER.Rows(Ligne_En_Tete_Vivier).Find(What:=Sourceur, LookIn:=xlValues, lookat:=xlWhole).Column
'On enlève filtre et affiche les colonnes/lignes masquées
With Feuille_VIVIER.Cells
.EntireColumn.Hidden = False
.EntireRow.Hidden = False
End With
On Error Resume Next
Feuille_VIVIER.ShowAllData
'On filtre sur le tableau
Feuille_VIVIER.Cells(Ligne_En_Tete_Vivier, Colonne_Sourceur).AutoFilter Field:=Colonne_Sourceur, Criteria1:=Tablo, Operator:=xlFilterValues

End Sub

R@g

Rechercher des sujets similaires à "vba filtre bdd choix listbox"