Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA et autofilter

8 réponses
Avatar
jipi
Bonjour,

J'ai un petit souci avec le filtre automatique en VBA

Quand j'utilise la commande suivante :

Selection.AutoFilter Field:=3D3,=20
Criteria1:=3D"=3D24/12/2002", Operator:=3DxlOr, _
Criteria2:=3D"=3D31/12/2002"

mon =E9cran reste vide.

Si je reviens sur le filtre personnalis=E9 et que clique=20
sur ok j'obtiens le r=E9sultat recherch=E9.

Comment obtenir ce r=E9sultat par VBA ?
Il doit manquer quelquechose mais je ne vois pas quoi.

Merci de votre aide

jipi

8 réponses

Avatar
David Giono
A première vue, je dirais que c'est une question de format de cellule. Tes
cellules sont au format date et dans VBA tu ne fais pas une recherche dans
le bon format.
Voilà pour l'explication. Je rencontre le même problème sur une recherche
dans une colonne où les cellules sont au format pourcentage et j'ai le même
résultat que toi. Si je sélectionne les cellules de ma colonne et que je
fais Format - Cellules et que je les mets au format standard, ma macro
fonctionne.

Si quelqu'un a la solution, je suis preneur aussi car j'aimerais bien garder
mes cellules au format pourcentage.


"jipi" a écrit dans le message de news:
02eb01c3c014$b3332be0$
Bonjour,

J'ai un petit souci avec le filtre automatique en VBA

Quand j'utilise la commande suivante :

Selection.AutoFilter Field:=3,
Criteria1:="$/12/2002", Operator:=xlOr, _
Criteria2:="1/12/2002"

mon écran reste vide.

Si je reviens sur le filtre personnalisé et que clique
sur ok j'obtiens le résultat recherché.

Comment obtenir ce résultat par VBA ?
Il doit manquer quelquechose mais je ne vois pas quoi.

Merci de votre aide

jipi
Avatar
AV
Ma "contribution" du jour....
Le filtrage de dates par Vba peut entraîner qques fortes prises de tête !
On est tributaire du format de la plage à filtrer, des formats de dates définis
dans les paramètres régionaux, de l'expression des formats en anglais et..... de
qques autres vicissitudes.... que j'oublie !

Pour que ça le fasse à tous les coups :
Ex. Feuille active avec un tableau en A1:Dx
- Etiquettes de colonnes en A1:D1
- Plage Nommée "lesDates" en C2:Cx
Filtrer les lignes des dates = 25/12/02 OU = 31/12/02

# Solution 1 #
Boucler sur la plage date et masquer lignes selon conditions
Sub zz_Filtre_Dates1()
Application.ScreenUpdating = False
For Each c In [lesDates]
If c.Value * 1 <> DateSerial(2002, 12, 25) * 1 And _
c.Value * 1 <> DateSerial(2002, 12, 31) * 1 Then _
Range(c.Address).EntireRow.Hidden = True
Next
End Sub

* Avantages de la méthode :
- Simplicité
- Pas de problèmes de formats

* Inconvénient :
- "Lenteur" d'exécution si la plage des dates est importante

# Solution 2 #
Filtrer en utilisant, non pas les dates formatées, mais les numéros de série
Pas de problème de langue et/ou de formats !
Avec le même exemple de tableau et les même critères de filtre

Sub zz_Filtre_Dates()
Application.ScreenUpdating = False
With [lesDates]
mémo = .NumberFormat
.NumberFormat = "General"
crit1 = DateSerial(2002, 12, 24) * 1
crit2 = DateSerial(2002, 12, 31) * 1
[C:C].AutoFilter Field:=1, Criteria1:="=" & crit1, Operator:=xlOr,
Criteria2:="=" & crit2
End With
'pour remettre au bon format en
'gardant la plage filtrée
For Each c In [lesDates]
c.NumberFormat = mémo
Next
End Sub

* Inconvénients de la méthode :
- Les formats de dates (quels qu'ils soient) de la plage "lesDates" doivent
être uniformes sinon la remise au format d'origine ne se fera pas !
- On est obligé de boucler sur la plage "lesDates" pour remettre au format
d'origine chacune des cellules tout en gardant la plage filtrée
PS : On peut regretter, au passage, qu'il n'existe pas de commande pour
atteindre les cellules non-visibles
* Avantage :
- Rapidité

# Solution 3 # (amha la plus "complète")
Utilisation d'un filtre élaboré
Avec le même exemple de tableau et les même critères de filtre :

Sub zz_Filtre_Dates2()
[F1] = "lesDates"
[F2] = "12/25/2002" 'format anglais !
[F3] = "12/31/2002"
[A1].CurrentRegion.AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=[F1:F3]
For i = 1 To 3
Cells(i, 6) = ""
Next
End Sub

* Avantages de la méthode
- Les formats de la plage dates de même que ceux de la plage de la zone de
critères peuvent être quelconques
- Grande rapidité
* Inconvénients :
J'en vois pas vraiment ......

AV
Avatar
jipi
Bonjour,

Merci pour ta contribution.
Je vais tester ça ce WE

jipi

-----Message d'origine-----
Ma "contribution" du jour....
Le filtrage de dates par Vba peut entraîner qques fortes
prises de tête !

On est tributaire du format de la plage à filtrer, des
formats de dates définis

dans les paramètres régionaux, de l'expression des
formats en anglais et..... de

qques autres vicissitudes.... que j'oublie !

Pour que ça le fasse à tous les coups :
Ex. Feuille active avec un tableau en A1:Dx
- Etiquettes de colonnes en A1:D1
- Plage Nommée "lesDates" en C2:Cx
Filtrer les lignes des dates = 25/12/02 OU = 31/12/02

# Solution 1 #
Boucler sur la plage date et masquer lignes selon
conditions

Sub zz_Filtre_Dates1()
Application.ScreenUpdating = False
For Each c In [lesDates]
If c.Value * 1 <> DateSerial(2002, 12, 25) * 1 And _
c.Value * 1 <> DateSerial(2002, 12, 31) * 1 Then _
Range(c.Address).EntireRow.Hidden = True
Next
End Sub

* Avantages de la méthode :
- Simplicité
- Pas de problèmes de formats

* Inconvénient :
- "Lenteur" d'exécution si la plage des dates est
importante


# Solution 2 #
Filtrer en utilisant, non pas les dates formatées, mais
les numéros de série

Pas de problème de langue et/ou de formats !
Avec le même exemple de tableau et les même critères de
filtre


Sub zz_Filtre_Dates()
Application.ScreenUpdating = False
With [lesDates]
mémo = .NumberFormat
.NumberFormat = "General"
crit1 = DateSerial(2002, 12, 24) * 1
crit2 = DateSerial(2002, 12, 31) * 1
[C:C].AutoFilter Field:=1, Criteria1:="=" & crit1,
Operator:=xlOr,

Criteria2:="=" & crit2
End With
'pour remettre au bon format en
'gardant la plage filtrée
For Each c In [lesDates]
c.NumberFormat = mémo
Next
End Sub

* Inconvénients de la méthode :
- Les formats de dates (quels qu'ils soient) de la
plage "lesDates" doivent

être uniformes sinon la remise au format d'origine ne se
fera pas !

- On est obligé de boucler sur la plage "lesDates" pour
remettre au format

d'origine chacune des cellules tout en gardant la plage
filtrée

PS : On peut regretter, au passage, qu'il n'existe
pas de commande pour

atteindre les cellules non-visibles
* Avantage :
- Rapidité

# Solution 3 # (amha la plus "complète")
Utilisation d'un filtre élaboré
Avec le même exemple de tableau et les même critères de
filtre :


Sub zz_Filtre_Dates2()
[F1] = "lesDates"
[F2] = "12/25/2002" 'format anglais !
[F3] = "12/31/2002"
[A1].CurrentRegion.AdvancedFilter
Action:=xlFilterInPlace,

CriteriaRange:=[F1:F3]
For i = 1 To 3
Cells(i, 6) = ""
Next
End Sub

* Avantages de la méthode
- Les formats de la plage dates de même que ceux de la
plage de la zone de

critères peuvent être quelconques
- Grande rapidité
* Inconvénients :
J'en vois pas vraiment ......

AV


.



Avatar
jipi
Bonjour,

Je vois que l'on a les mêmes pb.
C'est quand même étonnant qu'entre le manuel et le code
VBA ça ne se passe pas de la même façon!

Vois les propals de AV ci-après

jipi

-----Message d'origine-----
A première vue, je dirais que c'est une question de
format de cellule. Tes

cellules sont au format date et dans VBA tu ne fais pas
une recherche dans

le bon format.
Voilà pour l'explication. Je rencontre le même problème
sur une recherche

dans une colonne où les cellules sont au format
pourcentage et j'ai le même

résultat que toi. Si je sélectionne les cellules de ma
colonne et que je

fais Format - Cellules et que je les mets au format
standard, ma macro

fonctionne.

Si quelqu'un a la solution, je suis preneur aussi car
j'aimerais bien garder

mes cellules au format pourcentage.


"jipi" a écrit dans le message de news:
02eb01c3c014$b3332be0$
Bonjour,

J'ai un petit souci avec le filtre automatique en VBA

Quand j'utilise la commande suivante :

Selection.AutoFilter Field:=3,
Criteria1:="$/12/2002", Operator:=xlOr, _
Criteria2:="1/12/2002"

mon écran reste vide.

Si je reviens sur le filtre personnalisé et que clique
sur ok j'obtiens le résultat recherché.

Comment obtenir ce résultat par VBA ?
Il doit manquer quelquechose mais je ne vois pas quoi.

Merci de votre aide

jipi



.



Avatar
jipi
Bonjour,

J'ai testé ta solution 3 mais il me manque un élément que
représente [A1]?

Merci de ta collaboration

jipi

-----Message d'origine-----
Ma "contribution" du jour....
Le filtrage de dates par Vba peut entraîner qques fortes
prises de tête !

On est tributaire du format de la plage à filtrer, des
formats de dates définis

dans les paramètres régionaux, de l'expression des
formats en anglais et..... de

qques autres vicissitudes.... que j'oublie !

Pour que ça le fasse à tous les coups :
Ex. Feuille active avec un tableau en A1:Dx
- Etiquettes de colonnes en A1:D1
- Plage Nommée "lesDates" en C2:Cx
Filtrer les lignes des dates = 25/12/02 OU = 31/12/02

# Solution 1 #
Boucler sur la plage date et masquer lignes selon
conditions

Sub zz_Filtre_Dates1()
Application.ScreenUpdating = False
For Each c In [lesDates]
If c.Value * 1 <> DateSerial(2002, 12, 25) * 1 And _
c.Value * 1 <> DateSerial(2002, 12, 31) * 1 Then _
Range(c.Address).EntireRow.Hidden = True
Next
End Sub

* Avantages de la méthode :
- Simplicité
- Pas de problèmes de formats

* Inconvénient :
- "Lenteur" d'exécution si la plage des dates est
importante


# Solution 2 #
Filtrer en utilisant, non pas les dates formatées, mais
les numéros de série

Pas de problème de langue et/ou de formats !
Avec le même exemple de tableau et les même critères de
filtre


Sub zz_Filtre_Dates()
Application.ScreenUpdating = False
With [lesDates]
mémo = .NumberFormat
.NumberFormat = "General"
crit1 = DateSerial(2002, 12, 24) * 1
crit2 = DateSerial(2002, 12, 31) * 1
[C:C].AutoFilter Field:=1, Criteria1:="=" & crit1,
Operator:=xlOr,

Criteria2:="=" & crit2
End With
'pour remettre au bon format en
'gardant la plage filtrée
For Each c In [lesDates]
c.NumberFormat = mémo
Next
End Sub

* Inconvénients de la méthode :
- Les formats de dates (quels qu'ils soient) de la
plage "lesDates" doivent

être uniformes sinon la remise au format d'origine ne se
fera pas !

- On est obligé de boucler sur la plage "lesDates" pour
remettre au format

d'origine chacune des cellules tout en gardant la plage
filtrée

PS : On peut regretter, au passage, qu'il n'existe
pas de commande pour

atteindre les cellules non-visibles
* Avantage :
- Rapidité

# Solution 3 # (amha la plus "complète")
Utilisation d'un filtre élaboré
Avec le même exemple de tableau et les même critères de
filtre :


Sub zz_Filtre_Dates2()
[F1] = "lesDates"
[F2] = "12/25/2002" 'format anglais !
[F3] = "12/31/2002"
[A1].CurrentRegion.AdvancedFilter
Action:=xlFilterInPlace,

CriteriaRange:=[F1:F3]
For i = 1 To 3
Cells(i, 6) = ""
Next
End Sub

* Avantages de la méthode
- Les formats de la plage dates de même que ceux de la
plage de la zone de

critères peuvent être quelconques
- Grande rapidité
* Inconvénients :
J'en vois pas vraiment ......

AV


.



Avatar
michdenis
Bonjour Jipi,

[A1] ou Range("A1") on peut dire que c'est la même chose ( ou presque ! ) pour les fins de la procédure.

Cette procédure suppose que tes données débutent en A1 jusqu'à la colonne X et ligne Z. sur lequel tu veux appliquer un
filtre automatique.


Salutations!



"jipi" a écrit dans le message de news:06bd01c3c16d$f1bc2060$
Bonjour,

J'ai testé ta solution 3 mais il me manque un élément que
représente [A1]?

Merci de ta collaboration

jipi

-----Message d'origine-----
Ma "contribution" du jour....
Le filtrage de dates par Vba peut entraîner qques fortes
prises de tête !

On est tributaire du format de la plage à filtrer, des
formats de dates définis

dans les paramètres régionaux, de l'expression des
formats en anglais et..... de

qques autres vicissitudes.... que j'oublie !

Pour que ça le fasse à tous les coups :
Ex. Feuille active avec un tableau en A1:Dx
- Etiquettes de colonnes en A1:D1
- Plage Nommée "lesDates" en C2:Cx
Filtrer les lignes des dates = 25/12/02 OU = 31/12/02

# Solution 1 #
Boucler sur la plage date et masquer lignes selon
conditions

Sub zz_Filtre_Dates1()
Application.ScreenUpdating = False
For Each c In [lesDates]
If c.Value * 1 <> DateSerial(2002, 12, 25) * 1 And _
c.Value * 1 <> DateSerial(2002, 12, 31) * 1 Then _
Range(c.Address).EntireRow.Hidden = True
Next
End Sub

* Avantages de la méthode :
- Simplicité
- Pas de problèmes de formats

* Inconvénient :
- "Lenteur" d'exécution si la plage des dates est
importante


# Solution 2 #
Filtrer en utilisant, non pas les dates formatées, mais
les numéros de série

Pas de problème de langue et/ou de formats !
Avec le même exemple de tableau et les même critères de
filtre


Sub zz_Filtre_Dates()
Application.ScreenUpdating = False
With [lesDates]
mémo = .NumberFormat
.NumberFormat = "General"
crit1 = DateSerial(2002, 12, 24) * 1
crit2 = DateSerial(2002, 12, 31) * 1
[C:C].AutoFilter Field:=1, Criteria1:="=" & crit1,
Operator:=xlOr,

Criteria2:="=" & crit2
End With
'pour remettre au bon format en
'gardant la plage filtrée
For Each c In [lesDates]
c.NumberFormat = mémo
Next
End Sub

* Inconvénients de la méthode :
- Les formats de dates (quels qu'ils soient) de la
plage "lesDates" doivent

être uniformes sinon la remise au format d'origine ne se
fera pas !

- On est obligé de boucler sur la plage "lesDates" pour
remettre au format

d'origine chacune des cellules tout en gardant la plage
filtrée

PS : On peut regretter, au passage, qu'il n'existe
pas de commande pour

atteindre les cellules non-visibles
* Avantage :
- Rapidité

# Solution 3 # (amha la plus "complète")
Utilisation d'un filtre élaboré
Avec le même exemple de tableau et les même critères de
filtre :


Sub zz_Filtre_Dates2()
[F1] = "lesDates"
[F2] = "12/25/2002" 'format anglais !
[F3] = "12/31/2002"
[A1].CurrentRegion.AdvancedFilter
Action:=xlFilterInPlace,

CriteriaRange:=[F1:F3]
For i = 1 To 3
Cells(i, 6) = ""
Next
End Sub

* Avantages de la méthode
- Les formats de la plage dates de même que ceux de la
plage de la zone de

critères peuvent être quelconques
- Grande rapidité
* Inconvénients :
J'en vois pas vraiment ......

AV


.



Avatar
jipi
Bonjour Denis,

Finalement la solution ne fonctionne pas bien.

Je préfère la solution 2 qui elle me donne le résultat
recherché

jipi

-----Message d'origine-----
Bonjour Jipi,

[A1] ou Range("A1") on peut dire que c'est la même
chose ( ou presque ! ) pour les fins de la procédure.


Cette procédure suppose que tes données débutent en A1
jusqu'à la colonne X et ligne Z. sur lequel tu veux

appliquer un
filtre automatique.


Salutations!



"jipi" a écrit dans le message de
news:06bd01c3c16d$f1bc2060$

Bonjour,

J'ai testé ta solution 3 mais il me manque un élément que
représente [A1]?

Merci de ta collaboration

jipi

-----Message d'origine-----
Ma "contribution" du jour....
Le filtrage de dates par Vba peut entraîner qques fortes
prises de tête !

On est tributaire du format de la plage à filtrer, des
formats de dates définis

dans les paramètres régionaux, de l'expression des
formats en anglais et..... de

qques autres vicissitudes.... que j'oublie !

Pour que ça le fasse à tous les coups :
Ex. Feuille active avec un tableau en A1:Dx
- Etiquettes de colonnes en A1:D1
- Plage Nommée "lesDates" en C2:Cx
Filtrer les lignes des dates = 25/12/02 OU = 31/12/02

# Solution 1 #
Boucler sur la plage date et masquer lignes selon
conditions

Sub zz_Filtre_Dates1()
Application.ScreenUpdating = False
For Each c In [lesDates]
If c.Value * 1 <> DateSerial(2002, 12, 25) * 1 And _
c.Value * 1 <> DateSerial(2002, 12, 31) * 1 Then _
Range(c.Address).EntireRow.Hidden = True
Next
End Sub

* Avantages de la méthode :
- Simplicité
- Pas de problèmes de formats

* Inconvénient :
- "Lenteur" d'exécution si la plage des dates est
importante


# Solution 2 #
Filtrer en utilisant, non pas les dates formatées, mais
les numéros de série

Pas de problème de langue et/ou de formats !
Avec le même exemple de tableau et les même critères de
filtre


Sub zz_Filtre_Dates()
Application.ScreenUpdating = False
With [lesDates]
mémo = .NumberFormat
.NumberFormat = "General"
crit1 = DateSerial(2002, 12, 24) * 1
crit2 = DateSerial(2002, 12, 31) * 1
[C:C].AutoFilter Field:=1, Criteria1:="=" & crit1,
Operator:=xlOr,

Criteria2:="=" & crit2
End With
'pour remettre au bon format en
'gardant la plage filtrée
For Each c In [lesDates]
c.NumberFormat = mémo
Next
End Sub

* Inconvénients de la méthode :
- Les formats de dates (quels qu'ils soient) de la
plage "lesDates" doivent

être uniformes sinon la remise au format d'origine ne se
fera pas !

- On est obligé de boucler sur la plage "lesDates" pour
remettre au format

d'origine chacune des cellules tout en gardant la plage
filtrée

PS : On peut regretter, au passage, qu'il n'existe
pas de commande pour

atteindre les cellules non-visibles
* Avantage :
- Rapidité

# Solution 3 # (amha la plus "complète")
Utilisation d'un filtre élaboré
Avec le même exemple de tableau et les même critères de
filtre :


Sub zz_Filtre_Dates2()
[F1] = "lesDates"
[F2] = "12/25/2002" 'format anglais !
[F3] = "12/31/2002"
[A1].CurrentRegion.AdvancedFilter
Action:=xlFilterInPlace,

CriteriaRange:=[F1:F3]
For i = 1 To 3
Cells(i, 6) = ""
Next
End Sub

* Avantages de la méthode
- Les formats de la plage dates de même que ceux de la
plage de la zone de

critères peuvent être quelconques
- Grande rapidité
* Inconvénients :
J'en vois pas vraiment ......

AV


.




.




Avatar
AV
Finalement la solution ne fonctionne pas bien.


Hum...Es-tu sur de bien l'appliquer ?

Je préfère la solution 2 qui elle me donne le résultat
recherché


Tout va bien alors...;-)

AV