Re: Selection.AutoFilter
Bonsoir Vincent, Gérard, Brigitte, Jean-Mi, le Forum
Il y a deux mondes en fait à travers VBA........ Le monde d'Excel, piloté par VBA et qui permet de "macrotiser" plus ou moins bien ce qu'Excel peut faire....
Et ce qu'il faut bien comprendre dans le cas présent, l'Auto-Filter est une "facilité" d'Excel mais pas de VBA. En clair VBA ne fera pas plus de critères que ce qu'Excel propose. Et mis a part de jouer aussi avec des formules combinées à du VBA (ce qui deviendrait vraiment une usine à gaz) je ne pense pas que l'AutoFilter puisse te permettre d'aller plus loin que deux critères (par VBA ou manuellement)
Ceci étant dit, VBA est bien plus puissant que de "piloter" Excel et te permet de faire un filtre par programmation pûre.
Il y a aussi les filtres élaborés, mais je ne m'attarde pas dessus dans ce fil, mais je te conseille de voir mes posts récents à ce sujet...
Donc en VBA une première solution consisterait en une boucle for each toute simple sur un exemple tout simple aussi comme pour Bernard ci-dessus :
Sur un classeur Vierge avec deux feuilles "Feuil1" et "Feuil2"...
En feuille "Feuil1" / cellule "A1"tu colles ceci :
TESTCol1
Toto1
Toto3
Toto3
Toto4
Toto5
Toto6
Toto7
Toto8
Toto9
Toto10
Toto1
Toto2
Toto2
Toto3
Toto15
Toto16
Toto17
Toto18
Toto19
Toto20
Toto21
Toto22
Toto23
Toto24
Puis en feuille "Feuil1" / cellule "B1"tu colles ceci :
TESTCol2
ZAZA1
ZAZA14
ZAZA14
ZAZA4
ZAZA5
ZAZA6
ZAZA7
ZAZA8
ZAZA9
ZAZA10
ZAZA11
ZAZA12
ZAZA13
ZAZA14
ZAZA15
ZAZA16
ZAZA17
ZAZA18
ZAZA19
ZAZA20
ZAZA21
ZAZA22
ZAZA23
ZAZA24
En feuille "Feuil2" / cellule "A1" ET "B1" tu colles ceci :
RetourColA RetourColB
Et dans un module standard tu colles ceci :
Sub DemoFiterVBA()
Dim Plage As Range, Cell As Range
Dim L As Integer
Set Plage = Sheets("Feuil1").Range("A1:A" & Range("A65536").End(xlUp).Row)
For Each Cell In Plage
Select Case Cell.Value
Case "Toto1"
With Sheets("Feuil2")
L = .Range("A65536").End(xlUp).Row + 1
.Range("A" & L) = Cell
.Range("B" & L) = Cell.Offset(0, 1)
End With
Case "Toto2"
With Sheets("Feuil2")
L = .Range("A65536").End(xlUp).Row + 1
.Range("A" & L) = Cell
.Range("B" & L) = Cell.Offset(0, 1)
End With
Case "Toto3"
With Sheets("Feuil2")
L = .Range("A65536").End(xlUp).Row + 1
.Range("A" & L) = Cell
.Range("B" & L) = Cell.Offset(0, 1)
End With
End Select
Voici pour une première approche. Il est possible de faire la même chose via des tableaux indexés séquentiellement beaucoup plus rapides, mais il faut déjà comprendre le principe du code ci-dessus.
Bon Week End
@+Thierry