Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA : AutoFilter sur 3 critères avec *

Zepiii

XLDnaute Nouveau
Bonjour,

Je suis débutant en macro et je cale sur un cas "simple".

J'ai une liste du type :

A1
A2
A...
B1
B2
B...
Et ainsi de suite jusque Z.​

Je veux sélectionner tous ceux qui commencent par A et C. J'utilise donc la macro suivante :

AutoFilter Field:=1, Criteria1:=Array("A*", "C*"), Operator:=xlFilterValues​

Jusque là, pas de soucis. Tout fonctionne pour 2 critères.

Le problème est que si je veux sélectionner tous ceux qui commencent par A, C et D en utilisant la macro suivante :

AutoFilter Field:=1, Criteria1:=Array("A*", "C*", "D*"), Operator:=xlFilterValues​

Là, plus rien ne fonctionne

Comment faire pour sélectionner tout ce qui commence A, C et D ?

Merci,
Zepiii
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum, @Zepiii

@Zepiii [Bienvenue sur le forum]
Bonjour,
Comment faire pour sélectionner tout ce qui commence A, C et D ?
Merci,
Zepiii
En utilisant le filtre élaboré (avec un critère "formulé")
VB:
Sub a()
Range("D2").Formula = "=OR(LEFT(A2)=""A"",LEFT(A2)=""C"",LEFT(A2)=""D"")"
Range(Cells(1,1),Cells(Rows.Count,1).End(3)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("D1:D2"), Unique:=False
End Sub
PS: Test OK sur mon fichier de test et sur mon PC.
 
Dernière édition:

kingfadhel

XLDnaute Impliqué
Bonjour, le fil, le forum
@Zepiii , @Staple1600

VB:
Sub Filter_me()
Raneg("AD1") = "Filtre"
montableau = Array("A*", "C*", "D*")
For i = 2 To Application.CountA(Range("A:A"))
    x = Range("A" & i)
    trouve = False
    For j = LBound(montableau) To UBound(montableau)
       If x Like montableau(j) Then trouve = True
    Next
    If trouve Then
       Range("AD" & i) = 1
    Else
       Range("AD" & i) = 0
    End If
Next
Range("$AD$1:$AD$2700").AutoFilter Field:=1, Criteria1:="1"
End Sub
 

kingfadhel

XLDnaute Impliqué
Re,
Autre méthode sans passer ni par l’auto-filtre, ni l'ajout d'une colonne.
Juste masquer la ligne.

VB:
Sub Filter_me()
Cells.EntireRow.Hidden = False
Range("A1").Select
montableau = Array("A*", "C*", "D*")
For i = 2 To Application.CountA(Range("A:A"))
    x = Range("A" & i)
    trouve = False
    For j = LBound(montableau) To UBound(montableau)
       If x Like montableau(j) Then trouve = True
    Next
    If trouve Then
       GoTo suite
    Else
       Rows(i).EntireRow.Hidden = True
    End If
suite:
Next
End Sub
 

Zepiii

XLDnaute Nouveau
Merci @Ce lien n'existe plus et @kingfadhel

J'ai pris la version de Staple et ça fonctionne.

Je suis aussi pour le principe K.I.S.S. donc j'aurais une petite question :

Code:
Sub a()
Range("D2").Formula = "=OR(LEFT(A2)=""A"",LEFT(A2)=""C"",LEFT(A2)=""D"")"
Range(Cells(1,1),Cells(Rows.Count,1).End(3)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("D1:D2"), Unique:=False
End Sub

Est-il possible de ne pas devoir écrire la formule dans une case mais de directement l'incorporer dans le CriteriaRange? J'ai essayé mais ça me donne des erreurs et ne comprends pas pourquoi.

Grand merci à vous 2 en tout cas.
 

Zepiii

XLDnaute Nouveau
Bien sûr, c'était de la curiosité comme je suis nouveau dans le monde des macros.
J'ai du mal à comprendre pourquoi ce n'est pas possible mais je vais le découvrir petit à petit!

Un grand merci pour votre aide Topic résolu!
 

Staple1600

XLDnaute Barbatruc
Re

Avec des endives
VB:
Sub b()
With Range("D2")
    .Formula = "=OR(LEFT(A2)=""A"",LEFT(A2)=""C"",LEFT(A2)=""D"")"
    Range(.Offset(-1, -3), Cells(Rows.Count, 1).End(3)).AdvancedFilter 1, .Offset(-1).Resize(2), Unique:=False
    .Clear
End With
End Sub

Ce n'est pas possible, parce que le filtre élaboré fonctionne avec une plage de cellules comme critère.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…