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 k

par 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 I

Cdlt

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 I

A 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 Sub

Selon 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:

image

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
Rechercher des sujets similaires à "filtrer listbox partir combobox"