Double Filtre avec une ListBox

remplacez le code INIT par celui ci

Private Sub Init()
Dim i As Integer, nblig As Integer
Dim tablo() As Variant
Dim ws As Worksheet

Set ws = Worksheets("CVPO")

With ws.ListObjects("Tab_CVPO").DataBodyRange
    nblig = .Rows.Count
    ReDim tablo(nblig, 14) As Variant
    j = 0
    For i = 0 To nblig
        tablo(j, 0) = .Item(i + 1, 2).Value
        tablo(j, 1) = .Item(i + 1, 3).Value
        tablo(j, 2) = .Item(i + 1, 4).Value
        tablo(j, 3) = .Item(i + 1, 5).Value
        tablo(j, 4) = .Item(i + 1, 6).Value
        tablo(j, 5) = .Item(i + 1, 7).Value
        tablo(j, 6) = .Item(i + 1, 8).Value
        tablo(j, 7) = .Item(i + 1, 9).Value
        tablo(j, 8) = .Item(i + 1, 10).Value
        tablo(j, 9) = .Item(i + 1, 11).Value
        tablo(j, 10) = .Item(i + 1, 12).Value
        tablo(j, 11) = .Item(i + 1, 13).Value
        tablo(j, 12) = .Item(i + 1, 14).Value
         j = j + 1
    Next i
End With

With lst_Recherche
    .ColumnCount = 14
    .ColumnWidths = "50;50;50;50;50;50;50;50;50;50;50;50;50;50"
    .List = tablo
    'suppression des lignes vides
    For i = .ListCount - 1 To 0 Step -1
        If .List(i, 1) = "" Then .RemoveItem (i)
    Next i
End With

Dim nbcol As Byte

With ws.ListObjects("Tab_CVPO").HeaderRowRange
    nbcol = .Columns.Count
    ReDim tablo(0, nbcol) As Variant

    For i = 0 To nbcol
        tablo(0, i) = ws.Cells(1, i + 1).Value
    Next i
End With

With lst_Titre
    .ColumnCount = 14
    .ColumnWidths = "50;50;50;50;50;50;50;50;50;50;50;50;50;50"
    .List = tablo
End With
End Sub

Il faudra que vous adaptiez la police de la listbox pour que ce soit plus visible

Cordialement

J'ai copié/collé le code et cela fonctionne.

Je rencontre un problème au niveau des filtres maintenant... En effet, lorsque je filtre le Statut des Non-conformité en prenant Non levée le tableau est vierge, ce qui est normal vu que je n'ai pas de Non-conformité Non levée, mais lorsque je filtre avec Levée la ListBox reste vierge. Je dois alors passer par le bouton Tout voir pour remettre à zéro et relancer le filtre.

mais lorsque je filtre avec Levée la ListBox reste vierge. Je dois alors passer par le bouton Tout voir pour remettre à zéro et relancer le filtre.

Oui c'est normal. Puis vous avez un autre souci
dans le code btn_RechercheStatutNC_Click, en dessous de DIM, rajoutez cette ligne

Call init

Par contre dans votre fichier la listbox n'affiche pas le matricule. Normal ?
Du coup dans le boucle, changez le 14 en 12

Cela fonctionne, la première ComboBox réalise bien le tri. J'ai par contre remplacé le 14 en 13 et non 12 comme vous me l'indiquiez car les données du statut des non-conformités se trouvent en 13e colonne.

J'en ai fais de même pour le filtre sur les Priorités, le filtre fonctionne mais par contre il ne fait pas de Double filtre.
Exemple : Je possède 2 NC non levée (P1 et P2 (P1) et une NC levée (P1). Lorsque je filtre Non levée P1, la ListBox m'affiche les lignes des P1 c'est à dire 1 non levée et 1 levée au lieu d'une seule ligne.

Dans le code de recherche priorité, vous avez aussi changé la colonne ?

Il faut mettre 12 au lieu de 13

Oui du coup j'ai également changé le 13 en 12 et j'ai ajouté le Call Init mais ça ne fait pas le double filtre

quand vous dites double filtre, il faut que je comprenne bien comment vous fonctionnez

Vous faites le choix dans Statut NC (par exemple LEVEE), puis vous choisissez dans les priorités. Là cela fonctionne non ?Si vous changez la priorité et que vous avez toujours une valeur en statut NC, là le code ne va pas tenir compte du statut NC.

Le mieux est me donner un exemple de ce que vous faites que je reproduise sur le fichier que j'ai ici

Je vous transmet le fichier demain. J'essaye de vous expliquer par écrit dans un premier lieu.

Ce que je souhaite c'est pouvoir filtre en fonction de plusieurs critères (date, statut, priorité, famille de cvpo...) et peut importe l'ordre.

Actuellemen si je filtre Statut puis Priorité cela ne fonctionne pas. Lorsque je filtre Non Levée j'obtiens 2 lignes (ce qui est correct) puis des que j'ajoute la priorité P1 j'obtiens 2 lignes également mais 2 lignes P1 (une non levée et une levée).

En gros il ne prend pas en compte le premier filtre.

Ce que je souhaite c'est pouvoir filtre en fonction de plusieurs critères (date, statut, priorité, famille de cvpo...) et peut importe l'ordre.

Dans votre fichier CVPO il n'y a que deux choix possible

Actuellemen si je filtre Statut puis Priorité cela ne fonctionne pas.

Bizarre avec ce que vous ai donné cela fonctionne chez moi mais avec des données bidons que j'ai mises dans votre fichier

Si vous filtrez sur une des deux combo, cela fonctionne

Lorsque je filtre Non Levée j'obtiens 2 lignes (ce qui est correct) puis des que j'ajoute la priorité P1 j'obtiens 2 lignes également mais 2 lignes P1 (une non levée et une levée).

Là je ne comprends pas parce qu'en fait le code fait ceci.
Par rapport à votre exemple, si vous avez Non levée et que vous cliquez sur une priorité, le code ne va filtrer que sur que vous avez dans la listbox. Il ne s'occupe pas que de l'info Non levée

Bien entendu, vous ne devez pas avoir un CALL init dans le code priorité

dans l'attente de votre fichier

J'ai enlevé le Call Init de la recherche par priorité et ça fonctionne.

Je vous joint le fichier car j'ai trouvé d'autres problèmes.

Si vous filtrez "NON LEVÉE" puis "P1" ça fonctionne très bien. Puis si vous changez "P1" par "P2", l'affichage ne se fait plus (en conservant le filtre "NON LEVÉE").

152022-cvpo-2.xlsm (43.66 Ko)

J'ai enlevé le Call Init de la recherche par priorité et ça fonctionne.

je me doutais... je ne vous avais pas écrit de le mettre là ...

Puis si vous changez "P1" par "P2", l'affichage ne se fait plus (en conservant le filtre "NON LEVÉE").

Edit... je poste après

Edit : remplacez les deux codes par ceux ci-dessous

Private Sub btn_RechercheStatutNC_Click()
Dim i As Integer

Call Init

With Me.lst_Recherche
    If cbx_Priorite = vbNullString Then
        For i = .ListCount - 1 To 0 Step -1
            If .List(i, 13) <> UCase(cbx_StatutNC) Then .RemoveItem (i)
        Next i

    Else
        For i = .ListCount - 1 To 0 Step -1
            If .List(i, 12) <> UCase(cbx_Priorite) Or .List(i, 13) <> UCase(cbx_StatutNC) Then .RemoveItem (i)
        Next i
    End If
End With
End Sub
Private Sub btn_RecherchePriorite_Click()
Dim i As Integer

Call Init

With Me.lst_Recherche
    If cbx_StatutNC = vbNullString Then
        For i = .ListCount - 1 To 0 Step -1
            If .List(i, 12) <> UCase(cbx_Priorite) Then .RemoveItem (i)
        Next i
    Else
        For i = .ListCount - 1 To 0 Step -1
            If .List(i, 12) <> UCase(cbx_Priorite) Or .List(i, 13) <> UCase(cbx_StatutNC) Then .RemoveItem (i)
        Next i

    End If
End With
End Sub

Rem : dans ma logique l'idéal aurait été de toujours partir de la 1iere combo statutNC. Dans ce cas on aurait pu prévoir de vider la combo priorite si vous faites un changement dans la statutNC. Là cela aurait été plus simple
A voir si cette manière de faire a un intérêt pour vous ou pas

Merci Dan pour votre aide !
Cela fonctionne comme je le souhaite.

Imaginons maintenant que je souhaite ajouter un autre filtre à ceux déjà présent, par exemple un filtre par année. Est ce que je peux faire ce code ? Je n'ai pas encore créer ce filtre, c'est une idée pour le moment.

Private Sub btn_RechercheStatutNC_Click()
Dim i As Integer

Call Init

With Me.lst_Recherche
    If cbx_Priorite = vbNullString Then
    For i = .ListCount - 1 To 0 Step -1
    If .List(i, 13) <> UCase(cbx_StatutNC) Then .RemoveItem (i)
    Next i
        Else
        For i = .ListCount - 1 To 0 Step -1
        If .List(i, 12) <> UCase(cbx_Priorite) Or .List(i, 13) <> UCase(cbx_StatutNC) Then .RemoveItem (i)
        Next i
            Else
            For i = .ListCount - 1 To 0 Step -1
            If .List(i, 12) <> UCase(cbx_Priorite) Or .List(i, 13) <> UCase(cbx_StatutNC) Or .List(i,X) <> UCase(txb_Annee) Then .RemoveItem (i)
            Next i
End If
End With
End Sub

Imaginons maintenant que je souhaite ajouter un autre filtre à ceux déjà présent, par exemple un filtre par année.

Vous pouvez essayer mais cela risque de se compliquer. Plus vous voulez faire des filtres plus le code sera compliqué
Une manière simple était de ne pas pouvoir faire de choix si la combo précédente n'était pas complétée mais je peux comprendre votre souhait

Ici dans votre premier fichier posté je suis donc parti du principe d'une progression dans le remplissage des combo (année, Statut, famille ).
Donc je partais d'une listbox qui reprenaient tous les articles de la feuille au chargement de l'usf et selon la progression du remplissage des combo, on supprimait les lignes dans la listbox

Sinon si trop complexe on peut toujours penser à demander au code de filtrer dans la feuille puis d'importer les données filtrées dans la listbox.

Je peux toujours analyser si problème.

A votre dispo pour aller plus loin si besoin

Bonjour Dan,

Merci encore pour votre aide et vos réponses apportées. Pour multiplier les filtres, je vais m'arrêter, je ne voudrais pas surcharger le fichier.

Cordialement,

Rechercher des sujets similaires à "double filtre listbox"