Filtrer date par macro VBA - pb de format

Résolu/Fermé
Sailorbop - 23 mars 2007 à 17:09
 Riaolle - 15 déc. 2016 à 09:49
VBA - excel
Bonjour à tous,
(j'ai trouvé des réponses mais que j'ai déjà testé sans succès)

je voudrais faire une macro pour filtrer entre deux dates, dont les valeurs se trouvent soit dans 2 cellules ou dans 2 textbox...

le pb est que même en indiquant le format, Excel filtre en inversant le mois et le jour.

Par exemple :
Selection.AutoFilter Field:=1, Criteria1:=">=" & Format(TextBox1, "dd/mm/yy"), Operator:=xlAnd, Criteria2:="<=" & TextBox2

Date inscrite dans textbox1 = 06/02/07 envoie le critère 02/06/2007
Date inscrite dans textbox2 = 10/02/07 envoie le critère 02/10/2007

Le pire c'est que si je donne comme critère :

Criteria1:= Format(TextBox1, "dd/mm/yy"), Operator:=xlOr, Criteria2:=TextBox2

Et bien là... ça fonctionne...
Notez que j'ai omis Format(textbox2...) et je n'ai pas de différence.

Merci beaucoup !

9 réponses

J'ai galéré pendant des heures pour trouver !!!

Il y a une petite astuce pour que ça fonctionne.
Il faut formater la date dans VBA (dd/mm/yyyy) puis la transformer en chiffre via des TextBox de transition

13/05/2007 = 39215 dans VBA et Excel

Dans l'exemple ci dessous, je souhaite filtré ma colonne (n°4 donc D) entre 2 dates :
- date de début = TextBox1 (format dd/mm/yyyy)
- date de fin = TextBox2 (format dd/mm/yyyy)

- date de début = TextBox3 (format numérique)
- date de fin = TextBox4 (format numérique)


Il faut renseigner les TexBox 1 et 2.
Les 3 et 4 ne servent que de transition dans l'UserForm

Voici le code :

'===== DEBUT CHOIX DE LA PERIODE


'fourchette de date
startdate = CDate(Format(TextBox1.Value, "dd/mm/yyyy"))
enddate = CDate(Format(TextBox2.Value, "dd/mm/yyyy"))


'TRANSFORMATION NUMERIQUE DE LA DATE
Dim startdate2 As Single
startdate2 = startdate
TextBox3.Value = startdate2

Dim enddate2 As Single
enddate2 = enddate
TextBox4.Value = enddate2


'LANCEMENT DU FILTRE ============

Selection.AutoFilter Field:=4, Criteria1:=">=" & TextBox3.Value, Operator:=xlAnd, Criteria2:="<=" & TextBox4.Value


'+++++ FIN CHOIX DE LA PERIODE



C'est un peu tiré par les cheveux... Mais ça marche !!!

++
Juan's
15
redaiwa Messages postés 351 Date d'inscription mardi 7 octobre 2008 Statut Membre Dernière intervention 25 janvier 2024 119
Modifié par redaiwa le 19/11/2014 à 10:09
Salam Juan's.
Dommage que je ne puisse te donner qu'un seul point car tu en mérites au moins 10 !!!
Tu as certes aidé "Sailorbop", mais en réalité tu ne cesses d'aider des milliers de personnes encore aujourd'hui... dont moi :)
"La bonne parole est pareille à un bel arbre dont la racine est ferme et la ramure s'élance dans le ciel donnant à tout instant ses fruits" (Coran)
0
Merci mais beaucoup beaucoup!!!
0
Super, merci
0
Pour utiliser une date, personnellement je fais comme cela et je ne suis pas ennuyé

DatePourLeFiltre = format(UneDate, "#")
8
La réponse ici pour les anglophones :
http://www.ozgrid.com/VBA/autofilter-vba-dates.htm

Pour les anglophobes :
Le problème se pose à cause du format de date non-américain. Pour y remédier, il faut transformer la date en variable "long" en utilisant la fonction "DateSerial".

Le code ci-dessous :

Dim dDate As Date
Dim lDate As Long

dDate = DateSerial(Year(dDate), Month(dDate), Day(dDate))
lDate = dDate
Range("A1").AutoFilter  Field:=1 Criteria1:=">" & lDate



Enjoy
3
C'est parfait !
0
PS : la fonction CDate convertit les dates au format par défaut de Windows. Il est donc inutile de leur appliquer le formatage "dd/mm/yy".

Ton code serait donc :

Selection.AutoFilter Field:=1, Criteria1:=">=" & CDate(TextBox1.Value), Operator:=xlAnd, Criteria2:="<=" & CDate(TextBox2.Value)


Papou
1
Oui mais le filtre ne marche pas dans ce cas la.
Il faut transformer la date en chiffre comme indiqué ci-dessus.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sailorbop Messages postés 2 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 16 mai 2007 1
16 mai 2007 à 16:39
JUAN'S
Avec ton code, j'ai trouvé que cela marchait également comme cela (un peu plus simple) :
=> En fait je ne passe pas par l'intermédiaire des textbox3 et 4 et je filtre directement dans la colonne de date (j'ai pas tout compris pourquoi ça fonctionne car je suis une bille en VBA mais bon...) :


Private Sub CommandButton1_Click()

Dim a As Single
Dim b As Single

a = CDate(TextBox1)
b = CDate(TextBox2)

Selection.AutoFilter Field:=1, Criteria1:=">=" & a, Operator:=xlAnd, Criteria2:="<=" & b

End Sub

(NB ça plante si rien n'est entré dans un textbox mais bon c'est un pt'it truc en + à mettre)

Merci encore !
1
sailorbop Messages postés 2 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 16 mai 2007 1
30 mars 2007 à 17:15
Re-Bonjour !!
Personne qui aurait une petite idée ?? Merci d'avance !!!
0
Bonsoir sailorbop,

Pour récupérer des textes sous forme de date, il suffit de convertir les contenus comme suit :

CDate(TextBox1.Value)


Cordialement.

Papou
0
Merci beaucoup !
Alors de manière étrange pour ceux qui ont testé : une date fonctionne, deux dates ça ne marche plus sauf... pour des dates au 01/01/200xx... (1er janvier des années sélectionnées).

C'est bien un problème de traduction US => FR je pense.

Encore merci ! et désolé pour la prise de tête :o) !!
0
Bonjour,

Je suis en train de compiler une petite macro pour le boulot sur excel 2007.
pour cette macro de filtre auto, la dernière ligne de mon fichier de base est out le temps ignorée, avez-vous une solution pour qu'elle soit prise en compte?
0