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 SubJe 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)
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 iL'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,
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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