VBA : Lier une Listbox Choix Multiples avec tris de colonnes
Bonjour à tous,
Après de très nombreuses recherches infructueuses, je vous soumets mon casse-tête, en espérant que vous pourrez m'aider :
J'ai fait une listbox à choix multiple accessible via un bouton bleu (cf. Onglet Accueil du fichier ci-joint), qui ouvre un UserForm.
Je cherche à faire en sorte que le bouton "Valider la sélection" en bas du UserForm (CommandButton1), lance les actions suivantes dans l'ordre :
1. Filtrer : dans chacun des onglets "Source", "Vague 1", "Vague 2", "Vague 3", "Vague 4" et "Synthèse", pour afficher uniquement le ou les postes sélectionnés dans la Listbox
2. Afficher l'onglet "Vague 1"
3. Fermer le UserForm
Pour les actions 2 et 3, aucun problème. Si toutefois quelqu'un pouvait m'aider pour l'action filtrer, ça pourrait vraiment m'être utile
Pour entrer dans les détails, voici ce que ça donne au niveau de mon trifouillage du code actuellement :
Private Sub CommandButton1_Click()
Dim iItem As Integer
Dim sChaine As String
Dim sPostes As String
Dim sParateur As String
Dim filtre As String
For iItem = 0 To ListBox_Selection_Postes.ListCount - 1
If ListBox_Selection_Postes.Selected(iItem) Then
sPostes = ListBox_Selection_Postes.List(iItem)
sParateur = ", _" & vbLf
sChaine = sChaine & " *" & sPostes & " *" & sParateur
End If
Next iItem
If Right(sChaine, 1) = sParateur Then
sChaine = Left(sChaine, Len(sChaine) - 1)
End If
Range("TestResultat").Value = sChaine
filtre = Range("TestResultat")
With Worksheets("Source")
.Range("A1").AutoFilter Field:=2, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
With Worksheets("Vague 1")
.AutoFilterMode = False
.Range("A1").AutoFilter Field:=2, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
With Worksheets("Vague 2")
.AutoFilterMode = False
.Range("A1").AutoFilter Field:=2, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
With Worksheets("Vague 4")
.AutoFilterMode = False
.Range("A1").AutoFilter Field:=2, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
With Worksheets("Vague 3")
.AutoFilterMode = False
.Range("A1").AutoFilter Field:=2, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
With Worksheets("Synthèse")
.AutoFilterMode = False
.Range("A2").AutoFilter Field:=3, Criteria1:=Array(filtre), Operator:=xlFilterValues
End With
UF_HyperNavigation.Hide
End Sub
Quelques explications complémentaires :
La cellule TestResultat est située en C16 dans l'onglet Accueil.
String sParateur : J'ai voulu faire en sorte que les items sélectionnés soient séparés par ", _" & vbLf afin de leur permettre d'apparaître au format suivant dans la partie de code correspondant à l'AutoFilter avec Operator:=xlFilterValues :
ActiveSheet.ListObjects("Tableau_Source").Range.AutoFilter Field:=2, _
Criteria1:=Array("Poste 005", _
"Poste 009", _
"Poste 072", _
"Poste 073"), Operator:=xlFilterValues
Mais c'est ici que ça coince : je ne sais pas faire autrement et j'aurais besoin que le sParateur qui apparaît après le dernier item sélectionné n'apparaisse pas... Je ne sais pas si c'est suffisant pour que mon code fonctionne ou si j'ai fait des erreurs ailleurs.
Toute solution plus simple et plus efficace est bienvenue
Merci d'avance pour votre aide !
Bonjour,
Tout ça m'a l'air quelque peu compliqué...
Essaie déjà ceci :
Private Sub CommandButton1_Click()
Dim i%, filtre
With ListBox_Selection_Postes
For i = 0 To .ListCount - 1
If .Selected(i) Then filtre = filtre & ";" & .List(i)
Next i
End With
filtre = Replace(filtre, ";", "", 1, 1)
filtre = Split(filtre, ";")
Worksheets("Source").Range("A1").AutoFilter 2, filtre, xlFilterValues
Me.Hide
End Sub
Je laisse de côté le reste car c'est vide... ! Mais cela devrait te suffire pour tester comment filtrer sans aller faire de multiples détours.
Cordialement.
Merci beaucoup MFerrand ! Effectivement, ça fonctionne, tout simplement