Créations de ListBox dynamique pour filtrer un tableau

Bonjour à tous,

Je cherche à effectuer des filtres dynamiques à partir de listbox créés dynamiquement (à partir d'une sélection de colonne).

Le code ci-dessous permet de récupérer toutes les valeurs de colonnes voulues et et créer des listbox contenant leurs valeurs.

Private Sub Suivant_Click()
For i = 0 To Liste2.ListCount - 1
    Set col = New Collection
    Set ListeBox = UserForm1.Controls.Add("Forms.ListBox.1", Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column, True)
    With ListeBox
        .left = 300 + left_liste
        .Width = 132
        .MultiSelect = 1
        .top = 140 + top_liste
        .Height = 15
    End With

    ' gere les doublons
For Each cel In Range(Cells(6, Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column), Cells(200, Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column))
        On Error Resume Next
        col.Add cel.Value, CStr(cel.Value)
        On Error GoTo 0
    Next cel
    ' Ajoute les items de la colonne dans la listebox

    For Each itm In col
            ListeBox.AddItem itm
    Next itm
end sub 

J'essaye maintenant d’accéder à toutes les valeurs sélectionnées dans les listbox afin de pouvoir appliquer un filtre sur les colonnes.

Private Sub Filtrer_Click()
'Worksheets("test").Columns("A:ZZ").Hidden = True

    For i = 0 To Liste2.ListCount - 1
        Worksheets("test").Columns(CInt(Liste2.List(i, 1))).EntireColumn.Hidden = False
    Next i
End If

    For i = 0 To Liste2.ListCount - 1
        Set DotNetArray = CreateObject("System.Collections.ArrayList")
        'For Item = 0 To Me.Controls(i).ListCount
            'If Me.Controls(i).Selected(Item) = True Then DotNetArray.Add (Item)
            Cells(6, Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column).AutoFilter Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column, Criteria1:=DotNetArray, Operator:=xlFilterValues
        Next Item
    Next i

End Sub

Je bloque sur le fait de pouvoir ré-accéder à toutes les listbox ainsi qu'à leurs items selectionnés.

Comme les ListeBox sont crées dynamiquement je ne vois pas comment accèder aux valeurs de celles-ci.

Est-ce que quelqu'un pourrait m'éclairer sur le sujet ?

Merci d'avance :)

Ci-joint un exemple de ce que je veux réaliser (double clic sur un nom de colonne puis cliquer sur suivant afin de créer les listbox avec les contenus des colonnes)

46classeur1.xlsm (21.39 Ko)

Bonjour,

Voici une proposition d'adaptation du dernier code où on reprend les noms tels qu'ils ont été définis lors de la création :

For i = 0 To Liste2.ListCount - 1
    Set DotNetArray = CreateObject("System.Collections.ArrayList")
    LBname = Worksheets("test").Columns(CInt(Liste2.List(i, 1))).Column '<<< nom repris d'après création
    with Me.Controls(LBname)
        For j = 0 To .ListCount - 1
            If .Selected(j) = True Then DotNetArray.Add (j)
        Next j
    end with
    'Cells(6, LBname).AutoFilter Field:=LBname, Criteria1:=DotNetArray, Operator:=xlFilterValues '???
Next i

L'idéal serait de créer des noms évocateurs qui puissent être repris dynamiquement et facilement.

Ensuite, même si je suis partisan du fait de se passer des variables tant que possible, il vaut mieux en utiliser pour éviter les lignes à rallonge qui deviennent illisibles et plus difficiles à contrôler.

Par ailleurs, il vaut mieux cibler les feuilles même si elles sont actives au moment de l'exécution.

Cdlt,

Bonsoir,

Vous vous compliquez énormément la vie en n'utilisant pas les instructions relatives à un tableau structuré (classe ListObject)

ci-dessous version beaucoup plus simple et traitement du filtrage

120filtrage.xlsm (32.82 Ko)
Rechercher des sujets similaires à "creations listbox dynamique filtrer tableau"