Rechercher une date précise dans une liste

C@thy

XLDnaute Barbatruc
Bonjour le forum, ;)

je voudrais rechercher 31 décembre 2012 dans une colonne
comportant des dates au format jj/mm/aa
par macro afin de récupérer des données de la ligne et les copier
j'utilise Datevalue pour la transformer en date
la date 31/12/2012 se trouve bien dans ma colonne car c'est un jour ouvré
mais la recherche est infructueuse

En réalité c'est un peu + complexe, je recherche dans une liste
le dernier jour travaillé de l'année en cours (de lundi à vendredi)

Auriez-vous rencontré cd problème et trouvé une solution???

Un immense MERCI pour votre aide

Bises

C@thy
 
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

bonjour le fil

après essais avec différents cas ce code donne les meilleurs résultats
recherche le n° de série excel

Code:
Sub TrouveDateD2()

Range("D2").NumberFormat = "0"
Range("A1:A200").NumberFormat = "0"
Range("A1:A200").Find([D2], LookIn:=xlValues).Activate '.Select
Range("A1:A200").NumberFormat = "dd/mm/yyyy"
Range("D2").NumberFormat = "dd/mm/yyyy"

End Sub
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re Bébère,
après essais avec différents cas ce code donne les meilleurs résultats
recherche le n° de série excel
Ok sur le principe mais le problème est que si les formats de date initiaux dans le fichier sont différents de "dd/mm/yyyy" (exemple pour la plage de date : format "jj-mmmm" (format VBA récupéré : "d-mmmm") et la date en D2 : "j-mmm-aa" (format VBA récupéré : [$-40C]d-mmm-yy;@) , les plages au final perdent leur format de nombre d'origine.
C'est pourquoi je préfère stocker les formats d'origine au départ et remettre les plages au format initial à la fin.

En adaptant ta macro cela donnerait :
Code:
Sub TrouveDate()
MonFormatPlage = Range("A2:A201").NumberFormat 'récupérer le format de nombre de la plage de traitement
MonFormatDate = Range("D2").NumberFormat 'récupérer le format de nombre de la date recherchée
Range("D2").NumberFormat = "0"
Range("A2:A201").NumberFormat = "0"
Range("A2:A201").Find([D2], LookIn:=xlValues).Activate '.Select
Range("A2:A201").NumberFormat = MonFormatPlage 'rétablissement du format de nombre initial de la plage de traitement
Range("D2").NumberFormat = MonFormatDate 'rétablissement du format de nombre initial de la date recherchée
End Sub
Qu'en pense-tu ?
Pour l'instant, cela fonctionne sur les différents formats testés.
Il faudrait sur le principe pouvoir tester tous les formats de type date pour être sûr (j'en ai testé une vingtaine de mon côté) mais apparemment, cela donne le résultat escompté.
Si c'est effectivement le cas après un test complet sur l'ensemble des formats de nombre de type date utilisables, cela nous permettrait de valider ce type de traitement pour tous les cas de traitement de dates sur une feuille Excel.
A+
 

Bebere

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour David
le code est là comme idée
comme tu le dis avant traitement mettre les formats dans des variables,traiter et remettre les formats initiaux
j'ai testé ce qui me passait par la tête,pas eu de problème
je pense qu'il faut mettre les années au format "yyyy"(siècles différents exemple 1902, 2002 au format "yy" 02)
si un génie date passe par là,sais t'on jamais
comme je programme beaucoup,une réflexion
tout un temps dates sans problèmes ,puis commence les problèmes
est ce dû aux fichiers que l'on télécharge???
à bientôt
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re
je pense qu'il faut mettre les années au format "yyyy"(siècles différents exemple 1902, 2002 au format "yy" 02)
J'ai testé ce cas de figure et apparemment pas de problème.
Ci-joint un fichier test avec en feuille test2 les différents formats de cellules testés.
Chacun peut tester de son côté (peut-être qu'en fonction des versions Excel le résultat différera) et noter les nouveaux formats de nombres testés afin d'enrichir les tests.

J'ai également testé une version traitant la plage de dates dans un array.
Sur quelques tests, cela semble fonctionner en passant par Match au lieu de Find (mais à tester plus avant) :
Code:
Sub TrouveDateArray()
Set a = [PlageDates]
b = CDbl([DateATrouver])
c = Application.Match(b, a, 0)
MsgBox Cells(c, 1).Value
End Sub

tout un temps dates sans problèmes ,puis commence les problèmes
est ce dû aux fichiers que l'on télécharge???

Je n'ai pas de réponse pour l'instant mais maintenant je ferai attention si le cas se présente (peut-être effectivement un problème lors de téléchargement de fichier comportant un format de date système régional différent...).
A+
 

Pièces jointes

  • Recherche date Feuille_Array.xls
    503.5 KB · Affichages: 53

C@thy

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Recoucou,

David84, j'ai testé ta solution avec match, il faut adapter si les dates ne commencent pas en ligne 1 comme dans mon exemple :

c = Application.Match(b, a, 0) + n

mes données commencent en ligne 8 donc pour moi n = 7 car
PlageDates =DECALER(test2!$A$8;;;NBVAL(test2!$A:$A)-1) (j'ai un titre au-dessus des dates d'où le -1)

Bises

C@thy
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re
David84, j'ai testé ta solution avec match, il faut adapter si les dates ne commencent pas en ligne 1 comme dans mon exemple :

c = Application.Match(b, a, 0) + n

mes données commencent en ligne 8 donc pour moi n = 7 car
PlageDates =DECALER(test2!$A$8;;;NBVAL(test2!$A:$A)-1) (j'ai un titre au-dessus des dates d'où le -1)
Pas besoin je pense, essaie :
Code:
Sub TrouveDateArray()
Set a = [PlageDates]
b = CDbl([DateATrouver])
c = Application.Match(b, a, 0)
MsgBox a(c, 1).Value
End Sub
Mais au-delà de ce détail, la question est de savoir si le principe est fonctionnel, et apparemment tu me dis que oui donc c'est à noter mais je pense qu'il faut faire d'autres tests avant d'en être sûr.
A+
 

C@thy

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Yes, ça marche, sauf que ce qui m'intéresse c'est pas . value (la valeur je la connais puisque je la recherche dans la plage dates) mais .row car ensuite je vais faire un offset pour récupérer les valeurs qui sont sur la ligne de la date trouvée.

J'aime bien cette soluce, c'est court au niveau du code, et sans doute plus rapide au niveau de l'exécution.

Merci David!!!

Bises et bonne soirée

C@thy
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Re
Yes, ça marche, sauf que ce qui m'intéresse c'est pas . value (la valeur je la connais puisque je la recherche dans la plage dates) mais .row car ensuite je vais faire un offset pour récupérer les valeurs qui sont sur la ligne de la date trouvée.
Et bien si tu veux la ligne, tu n'as qu'à demander la ligne au lieu de la valeur (puisque a est instancié en tant qu'objet (utilisation de Set), tu peux ensuite rechercher tout ce qui a trait à cet objet, c'est tout l'intérêt d'instancier un objet) :
Code:
Sub TrouveDateArray()
Set a = [PlageDates]
b = CDbl([DateATrouver])
c = Application.Match(b, a, 0)
MsgBox a(c).Row
End Sub
Mais je réitère ma mise en garde : pense à bien tester cette solution sur des formats de nombre différents pour vérifier qu'elle est fiable !
Pour ma part, je pense que oui mais c'est à toi de t'en assurer.
J'aime bien cette soluce, c'est court au niveau du code, et sans doute plus rapide au niveau de l'exécution.
Pas sûr que Match soit super rapide dans un array (contrairement à l'utilisation de EQUIV dans la feuille de calcul) mais dans ce cadre précis ce n'est pas la rapidité d'exécution qui devrait poser problème, et puis l'utilisation de Find ne donne rien de concluant de mon côté (je parle de ce cas spécifique).
A+
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Oui oui c'est bien ce que j'ai fait, j'ai récupéré la ligne avec .row

J'ai testé plein de formats, pour l'instant tout est bon
(comme dans le cochon! Niark!)

Et comme cette soluce me plait bien, j'ai bien envie de l'adopter dans mes programmes.

Merci à toi de me l'avoir fait découvrir, je trouve que c'est 1000 fois mieux que de sauvegarder le format des 2, déformerez, chercher puis reformater les 2, c'est un peu laborieux.

Good night everybody

Bises

C@thy
 

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour à tous


Voic un petit fichier de synthèse des principaux codes de cette discussion de David, Bébère que je remercie et de moi même :). Il ya des choses que je commence à comprendre mais c'est pas gagné :eek:.

J'ai aussi apprécié le dernier code de David avec match :eek:.

Merci aussi à Cathy car sans elle, on aurait pas trouvé autant de solutions dans une seule discussion :).
 

Pièces jointes

  • TrouveDateValeurFormuleV2.xlsm
    38.5 KB · Affichages: 56

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour Michel,
Merci pour le fichier:).
pour info, TrouveDate et TrouveDate2 plantent chez moi (version 2010) sur les feuilles 2 et 3, ainsi que sur la feuille 1 à partir du moment où le format de nombre diffère du format standard.
Pour TRouveDate :
nadr = ActiveSheet.Range("A1:A100").Find(DATeAT, LookIn:=xlFormulas, lookat:=xlWhole).Offset(0, 0).Address
Pour TrouveDate2 :
nadr = ActiveSheet.Range("A1:A100").Find(CDbl(CDate(DATeAT2)), LookIn:=xlFormulas).Offset(0, 0).Address
A+
 
Dernière édition:

C@thy

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

MJ13 à dit:
Merci aussi à Cathy car sans elle, on aurait pas trouvé autant de solutions dans une seule discussion :).
Hi hi c'est pour ça que je pose plein de questions! ;)
Comme mes questions sont souvent compliquées ça fait progresser tous les lecteurs du fil et même les contributeurs!

Bizz

C@thy
 

MJ13

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonjour à tous

Désolé Jean-Marcel, mais il y avait tellement de réponses que je n'ai pas vu la tienne :eek:. Après, c'est aussi parce que David a bien insisté sur le post #34 que cela m'a mis la puce à l'oreile.

Donc Merci aussi à Jean-Marcel (aux autres aussi si il y en a qu'ils se dénoncent :D) .

Merci pour le fichier:).
pour info, TrouveDate et TrouveDate2 plantent chez moi (version 2010) sur les feuilles 2 et 3, ainsi que sur la feuille 1 à partir du moment où le format de nombre diffère du format standard.

David: Merci pour le like :eek:. J'ai fait plusieurs tests, et cela montre qu'on peux avoir des problèmes assez facilement dans la recherche des dates. Après c'est aux personnes qui ont ce type de problème d'analyser leurs données à exploiter et de prendre la solution qui convient en ayant testé bien sur :).

Bon Week-end à tous :).
 

david84

XLDnaute Barbatruc
Re : Rechercher une date précise dans une liste

Bonsoir,
concernant le code de Jean-Marcel, testé avec succès sur 2007 et 2010.
En fait, concernant ce travail sur les dates, je me suis rappelé que JB avait déjà effectué ce type de test ici avec une conclusion qui rejoint la nôtre : avec Match (et contrairement à Find), le format des dates du champ de recherche n'a pas d'importance.
Il me paraît correct de faire ce rappel.
A+
 

Discussions similaires

Statistiques des forums

Discussions
312 158
Messages
2 085 829
Membres
102 994
dernier inscrit
snoopy70