Filtrer avec 3 conditions pouvant changer
Bonjour,
Dans le fichier excel joint, je cherche à filtrer la colonne D pour ne faire apparaître que les lignes comportant les codes commençant par 216/217/218.
J'ai déjà des filtres pour 1 critère, ex pour , n'afficher que ceux qui commence par 121
ActiveSheet.Outline.ShowLevels RowLevels:=0, columnlevels:=1
ActiveSheet.Range("$A$4:$KT$2000").AutoFilter Field:=1, Criteria1:="<>"
ActiveSheet.Range("$A$4:$KT$2000").AutoFilter Field:=4, Criteria1:="=121*", _
Operator:=xlAnd
J'ai également ceux pour 2 critères , par exemple 202 et 203
' ActiveSheet.Outline.ShowLevels RowLevels:=0, columnlevels:=1
ActiveSheet.Range("$A$4:$KT$2000").AutoFilter Field:=1, Criteria1:="<>"
ActiveSheet.Range("$A$4:$KT$2000").AutoFilter Field:=4, Criteria1:="=202*" _
, Operator:=xlOr, Criteria2:="=203*"
J'avais pensé à la commande Array mais il faut sélectionner la totalité des codes or le fichier est amené à évoluer régulièrement. La seule constante est que cela commencera toujours par 216/217/218.
J'ai également tenté de le critère "=21*" mais cela inclut les 211 et 215 qui ne doivent pas apparaître et si on fait exclure par exemple les 5, si le code est 217A5 cela n'apparaît pas.
J'avais pensé à faire un premier filtre triant 2 critères et un autre avec le 3ème critère et essayer de les "coller" avec Call mais cela ne doit pas être le but de la fonction.
J'avais aussi pensé à un filtre à la couleur, en imaginant que les lignes soient de la même couleur mais les lignes blanches doivent le rester et apparaître.
Si vous avez des idées je suis preneuse, j'ai l'impression en regardant le net que ce n'est pas possible mais je me trompe peut être.
Merci!
Bonjour PetiteStef,
Voici un code qui devrait convenir
Option Explicit
Option Base 1
Sub Filtrer216_217_218()
Dim dLig As Long, Ind As Long, Lig As Long
Dim TabVal() As String
With Sheets("2018")
dLig = .Range("D" & Rows.Count).End(xlUp).Row
For Lig = 5 To dLig
If .Range("D" & Lig) Like "216*" Or _
.Range("D" & Lig) Like "217*" Or .Range("D" & Lig) Like "218*" Then
Ind = Ind + 1
ReDim Preserve TabVal(Ind)
TabVal(Ind) = .Range("D" & Lig)
End If
Next Lig
.Range("$A$4:$M$1304").AutoFilter Field:=4, Criteria1:=Array(TabVal), Operator:=xlFilterValues
End With
End Sub
A+
Hello,
Edit : Salut Bruno
Tu ne peux pas utiliser + de 2 critères dans les filtres classiques :
ActiveSheet.Range("$A$4:$M$1304").AutoFilter Field:=4, Criteria1:="=216*", Criteria2:="=217*", Operator:=xlOr
Donc à partir de là, tu peux utiliser la bonne vieille méthode de la boucle qui ne déçoit jamais, voici un exemple :
Sub MultiFilter()
Dim rng As Range, r As Range
Set rng = Worksheets(1).Range("D5:D1304")
For Each r In rng
v = Left(r.Value, 3)
If v = "216" Or v = "217" Or v = "218" Then
r.EntireRow.Hidden = False
Else
r.EntireRow.Hidden = True
End If
Next r
End Sub
Mais ce n'est pas la + performante.
Ensuite tu as les filtres avancés, mais avec tes cellules fusionnées je doute que ça fasse bon ménage ...
Ensuite, tu pourrais faire un tri sur ta colonne D, puis récupérer la première ligne et dernière ligne selon tes critères et masquer tout ce qui est avant et après ces lignes, Par contre si tu as d'autres critères sur d'autres colonne ça risque d'être compliqué
Tu peux le faire avec une instruction SQL aussi.
Et je pense que c'est tout
Salut Rag02700
Oula ... ou t'en vas-tu
Regarde mon fichier et tu verras que ça peut être tout simple
A+
En effet, je n'ai pas pensé du tout à ça
Je suis pas trop du matin
++