Filtrer une ListBox à partir d'une ComboBox
Bonjour cher Forum!
Il y a beaucoup de sujet déjà sur ma problématique, toutefois je ne trouve pas ce qui me correspond, donc je sollicite votre aide!
Dans mon UserForm (UF_RegistreDC) il y a une ListBox1 et une ComboBox_Filtre. Ce que j'aimerais pour ne prendre qu'un exemple dans la ComboBox_Filtre est que quand la saisie est Architecture qu'il me montre uniquement les directives qui débute par "DC-A". Vous aurez accès à se UserForm en cliquant sur le lien dans la première feuil du classeur. La ListBox1 prend ses informations dans la feuille nommé "DATA_DC".
Votre aide est toujours très apprécié!
Bonjour,
SI j'ai bien compris, dans la macro "Ouvrir_RegistreDC"
Remplacez cette partie de code
For I = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve Choix(1 To I)
For k = LBound(TblTmp) To UBound(TblTmp, 2)
Choix(I) = Choix(I) & TblTmp(I, k) & " * "
Next kpar celle-ci:
For I = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve Choix(1 To I)
For k = LBound(TblTmp) To UBound(TblTmp, 2)
If Left(TblTmp(I, 1), 4) = "DC-A" Then Choix(I) = Choix(I) & TblTmp(I, k) & " * "
Next k
Next ICdlt
Bonjour Arturo83!
Merci pour ton aide c'est très apprécié.
En fait, je me rend compte que ma problématique n'est pas très clair, je vais tenter de mieux l'expliquer. Dans mon UserForm (UF_RegistreDC), il y a une ComboBox appelé ComboBox_Filtre. Il y a des choix tel que : Architecture, Mécanique, Structure, etc... J'ai quand sélectionnant par exemple architecture il me montre uniquement les directives qui commence par DC-A, si je sélectionne Mécanique qu'il me montre uniquement les directives qui commence par DC-ME et ainsi de suite.
J'espère avoir mieux réussi à exposer mon problème!
Alors ceci:
For I = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve Choix(1 To I)
'on affecte la variable DC en fonction du nombre de caractères recherchés
For k = LBound(TblTmp) To UBound(TblTmp, 2)
Select Case Left(TblTmp(I, 1), 4) 'recherche sur les 4 premiers caractères
Case Is = "DC-A" 'Architecture
DC = "DC-A"
Case Is = "DC-C" 'Civil
DC = "DC-C"
Case Is = "DC-S" 'Structure
DC = "DC-S"
End Select
If DC = "" Then 'si rien n'est trouvé dans les 4 premiers caractères alors, on cherche sur les 5 premiers caractères
Select Case Left(TblTmp(I, 1), 5) 'recherche sur les 5 premiers caractères
Case Is = "DC-IN" 'Interne
DC = "DC-IN"
Case Is = "DC-ME" 'Mécanique
DC = "DC-ME"
End Select
End If
If Left(TblTmp(I, 1), 4) = DC Then Choix(I) = Choix(I) & TblTmp(I, k) & " * "
Next k
Next IA compléter sur le même principe pour les DC manquants.
Je ne comprends pas comment il peut faire le lien avec le choix fait dans la ComboBox_Filtre? Je voudrais que dans l'évènement Change() de la ComboBox_Filtre il fasse le trie dans la ListBox1. Donc, en cliquant sur la ComboBox_Filtre, je sélectionne par exemple Architecture et il me met dans la ListBox1 uniquement les directives commençant par DC-A.
Je pense bien comprend ton code, toutefois je ne vois pas comment il fait le lien avec ce qui a été sélectionné dans la ComboBox_Filtre?
En fait, j'ai mal compris le problème dès le début. Le problème est que chez moi je ne peut rien tester, car j'ai beaucoup de bugs(probablement liés à ma version un peu ancienne d'excel), donc je fais comme je le comprends puisque je ne peux rien tester.
Il faut donc récupérer la sélection de la comboBox_filtre, ici j'ai créée la variable "Structure" pour le choix retenu,
Private Sub ComboBox_Filtre_Change()
If ComboBox_Filtre.Value <> "" Then
Label_Filtre.Visible = False
Label_Feffacé.Visible = True
Else
Label_Filtre.Visible = True
Label_Feffacé.Visible = False
End If
Structure = ComboBox_Filtre.Text 'Variable structure pour l'item sélectionné dans la comboBox
If ComboBox_Filtre <> "" Then
Dim tb()
Dim I%, j%
tb = Sheets("DATA_DC").Range("A2:GC" & Sheets("DATA_DC").[B2000].End(xlUp).Row).Value
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) = Structure Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
End SubSelon le choix que vous ferez dans la comboBox_Filtre, il faudra peut-être ajouter un astérisque dans "If tb(I, 2) = Structure Then".
Salut le fil,
Pour ma part je partirais sur une autre réflexion.
Tout d'abord modifier le tableau TB_filtre comme ceci:
A toi de modifier les ID à ta guise
Au niveau du formulaire tu modifie les propriétés de ComboBox-Filtre
- ColumnCount = 2
- BoundColumn = 1
- ColumnWidth =0
- RowSource = TB_filtre
Il ne te reste plus qu' faire la comparaison
ListBox1.Clear
For i = 1 To UBound(tb)
If tb(i, 2) Like ComboBox_Filtre.Value & "*" Then
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(i, 1)
'...
'...Petites remarques :
Le tableau TB_id n'a pas lieu d'être tu doit l'intégrer au tableau TB_directive et l'incrementer à chaque ajout de ligne, ex :
Dim lstObj As ListObject
Dim lstRow As ListRow
Set lstObj = Feuil5.Range("TB_directive").ListObject
Set lstRow = lstObj.ListRows.Add
lstRow.Range("A1") = Application.WorksheetFunction.Max(lstObj.ListColumns("ID")) + 1
'...
'...Dans tous les cas il faut éviter de placer des tableaux à coté l'un de l'autre.
Eviter aussi les accents dans le code.
Je n'ai pas tester le code donc ne pas hésiter à remonter un bug éventuel.
Oupsss edit la ligne du Like...
Bonjour à vous deux!
Merci pour vos aides. Asturo83, j'ai pris ton code et je l'ai adapté et ça fonctionne à la perfection merci beaucoup! Voici l'adaptation :
Private Sub ComboBox_Filtre_Change()
If ComboBox_Filtre.Value <> "" Then
Label_Filtre.Visible = False
Label_Feffacé.Visible = True
Else
Label_Filtre.Visible = True
Label_Feffacé.Visible = False
End If
Dim tb()
Dim I%, j%
tb = Sheets("DATA_DC").Range("A2:GC" & Sheets("DATA_DC").[B2000].End(xlUp).Row).Value
If ComboBox_Filtre = "" Then
TblTmp = Rng.Value
For I = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve Choix(1 To I)
For k = LBound(TblTmp) To UBound(TblTmp, 2)
Choix(I) = Choix(I) & TblTmp(I, k) & " * "
Next k
Next I
ListBox1.List = Rng.Value
End If
If ComboBox_Filtre = "Architecture" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) Like "DC-A*" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Mécanique" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) Like "DC-ME*" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Structure" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) Like "DC-S*" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Civil" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) Like "DC-C*" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Interne" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 2) Like "DC-IN*" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Annuler" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 7) <> "" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Env. au client" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 8) <> "" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "Approuvé" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 13) <> "" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
If ComboBox_Filtre = "ODC" Then
ListBox1.Clear
For I = 1 To UBound(tb)
If tb(I, 16) <> "" Then 'Recherche de l'item sélectionné
'Ajoute une ligne et insère une donnée dans la colonne de gauche
ListBox1.AddItem tb(I, 1)
'Ajoute des données dans les colonnes de droite
For j = 1 To UBound(tb, 2)
ListBox1.List(ListBox1.ListCount - 1, j - 1) = tb(I, j)
Next j
End If
Next I
End If
Dim X
For X = 0 To ListBox1.ListCount - 1
With ListBox1
.List(X, 3) = Format(.List(X, 3), "yyyy-mm-dd")
.List(X, 5) = Format(.List(X, 5), "yyyy-mm-dd")
.List(X, 7) = Format(.List(X, 7), "yyyy-mm-dd")
.List(X, 12) = Format(.List(X, 12), "yyyy-mm-dd")
.List(X, 14) = Format(.List(X, 14), "# ### ##0.00 $")
End With
Next X
End Sub