Menu

Filtrer date par macro VBA - pb de format [Résolu/Fermé]

- - Dernière réponse :  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 !
Afficher la suite 

9 réponses

Meilleure réponse
14
Merci
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

Dire « Merci » 14

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 40129 internautes nous ont dit merci ce mois-ci

redaiwa
Messages postés
347
Date d'inscription
mardi 7 octobre 2008
Statut
Membre
Dernière intervention
2 juin 2015
117 -
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)
Merci mais beaucoup beaucoup!!!
Super, merci
6
Merci
Pour utiliser une date, personnellement je fais comme cela et je ne suis pas ennuyé

DatePourLeFiltre = format(UneDate, "#")
2
Merci
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
C'est parfait !
1
Merci
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
Oui mais le filtre ne marche pas dans ce cas la.
Il faut transformer la date en chiffre comme indiqué ci-dessus.
Messages postés
2
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
16 mai 2007
2
1
Merci
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 !
Messages postés
2
Date d'inscription
vendredi 23 mars 2007
Statut
Membre
Dernière intervention
16 mai 2007
2
0
Merci
Re-Bonjour !!
Personne qui aurait une petite idée ?? Merci d'avance !!!
0
Merci
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
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
Merci
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?