Reconnaissance de date dans une extraction VBA

Résolu/Fermé
stphn - 29 juil. 2017 à 11:41
 stphn - 14 août 2017 à 17:18
Bonjour,

Dans le cadre de mon travail, je reçois des données météo par mail plusieurs fois par jour. J'ai créé une macro pour extraire les infos que je souhaite des mails (en m'inspirant largement de ce que j'ai trouvé sur le net). Jusque là tout va bien.
Le hic, c'est que la date de réception du mail ne coïncide pas toujours avec la date de la donnée. Alors au lieu de prendre cette date facile a extraire, je dois prendre la date dans le corps du mail. Or, cette date est au format américain (ex : "Saturday, June 17, 2017 "), et lors de l'extraction, excel ne reconnait même pas qu'il s'agit d'une date, donc impossible pour moi de faire des traitements à partir de là...

J'ai déjà regardé tout ce qui concerne les dates sur excel, mon problème vient du fait que excel ne reconnait pas qu'il s'agit d'une date. Si j'arrivais à le faire, le changement de format ne semble pas un soucis.

Quelqu'un pourrait m'aider ?

A voir également:

3 réponses

Bonjour stphn,

Fichier Excel 2007 : https://mon-partage.fr/f/pybQFIWS/

Ctrl e => affichage de 3 dates en anglais et en français
Alt F11 pour voir le code VBA, puis revenir sur Excel

Merci de me dire si ça te convient.

Cordialement
 
2
J'ai testé, et effectivement dans ton fichier ça marche bien. Par contre, quand j'ai voulu l'incorporer dans le mien, des problèmes surgissent. Je pense que mon extraction n'est pas propre, donc la chaine de base pour la fonction n'est pas bonne. Je replonge dedans et je reviens :)

EDIT :
J'ai corrigé mon extraction, qui avait un caractère en trop. du coup maintenant, j'ai l'information écrite en français... Mais toujours pas reconnu par excel comme un format date, et j'ai des dates incorrectes (le projet a commencé en juin et j'ai des dates en janvier). Est ce que ça peut être du au p1 qui est utilisé 2 fois pour deux choses différentes dans le script ?

EDIT 2 :
Il se passe un truc bizarre dans la dernière commande de la fonction (Mid$(chn, 1, 1) = Chr$(Asc(chn) - 32): DateEN2FR = chn) car jusque là, tout va bien (ou presque, mais j'y reviens après). La sortie que j'ai se fait avec un signe carré : 7/06/2017 au lieu de 17/06/2017 (j'ai modifié le format de sortie).
L'autre truc étrange, c'est que dans l'extraction, la valeur de jour est de "17,". Ce qui est une drôle de valeur, non ?
0
 
Fichier Excel 2007 modifié : https://mon-partage.fr/f/Ve6DOpBw/
Ctrl e => affichage de 3 dates anglaises, sous forme jj/mm/aaaa

Le retour de la fonction DateEN2FR() est de type Date ; tu peux donc
faire un calcul dessus, ou l'afficher facilement avec le format que tu
préfères ; par exemple, dans une cellule au format jjjj j mmmm aaaa
ça affichera : Samedi 17 juin 2017 (pour "Saturday, June 17, 2017") ;
avec VBA, le même format est "dddd d mmmm yyyy".

Merci de me donner ton avis.
 
0
En fait, j'avais dû changer le format à cause du carré (car avec le carré il ne reconnaissait pas une date mais une chaine). Effectivement la nouvelle version ne me pose plus ce problème. Par contre, l'extraction de date me donne des valeurs fausses : "Tuesday, July 4, 2017" devient le 07/04/2017, soit la bonne date... en écriture américaine ^^
Je pense que le problème vient du fait que les date à un chiffre ne sont pas en 0X mais en X (dans cet exemple : pas en 04 mais en 4). Le reste des dates est dans le bon format par contre.
0
 
Copie d'écran : https://mon-partage.fr/f/Uo58tt3C/

J'ai essayé ta date : "Tuesday, July 4, 2017" ; en laissant telle quelle
la fonction DateEN2FR(), ça retourne bien : 04/07/2017.

Fichier Excel 2007 modifié : https://mon-partage.fr/f/elq7tPNR/

J'ai modifié seulement la fin de la sub Essai(), pour le 3ème exemple :


  ' ici, jour sur 1 chiffre : 4
  chn = "Tuesday, July 4, 2017"


À te lire.
 
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
1 août 2017 à 09:32
Bonjour le fil, bonjour le forum,

Une autre proposition VBA qui considère que la date extraite est en A1 (à adapter) et renvoie en A2 (à adapter) la date en français au format que tu veux (à adapter) reconnue comme date par Excel :

Sub Macro1()
Dim MA() As Variant 'déclare la variable MA (Mois Anglais)
Dim AN As Long 'déclare la variable AN (ANnée)
Dim MO As String 'déclare la variable MO (MOis)
Dim JO As Byte 'déclare la variable JO (JOur)
Dim D As Long 'déclare la variable D (Date)

MA = Array("JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER") 'définit le tableau MA

'voir l'aide sur la fonction SPLIT
AN = CLng(Split(Range("A1").Value, ",")(2)) 'Crée un groupe de 3 (de 0 à 2) mots séparés par la virgule et récupère le troisième groupe (2) = [l'année AN] converti en entier Long
'du second groupe de 3 mots séparés par la virgule  = ["espace", le mois et le jour], sans l'espace devant (avec TRIM),
'crée un goupe de 2 mots séparés par une espace et récupère le premier (0) = [le mois en lettre]
MO = Split(Trim(Split(Range("A1").Value, ",")(1)), " ")(0)
'du second groupe de 3 mots séparés par la virgule  = ["espace", le mois et le jour], sans l'espace devant (avec TRIM),
'crée un goupe de 2 mots séparés par une espace et récupère le second (1) = [le jour] converti en en entier Byte
JO = CByte(Split(Trim(Split(Range("A1").Value, ",")(1)), " ")(1))
For I = 0 To 11 'boucle sur tous les mois du tableau MA
    If UCase(MO) = MA(I) Then Exit For 'si le mois MO (converti en majuscules) est égal au mois de MA, sort de la boucle
Next I 'prochain mois de la boucle
D = DateSerial(AN, I + 1, JO) 'définit la date D en entier long
Range("A2") = D 'renvoie la date dans A1 (à adapter à ton cas)
Range("A2").NumberFormat = "dd/mm/yyyy" 'format de date de la cellule A2 (tu choisiras le format que tu préfères...)
End Sub

1
Merci pour cette proposition !
Je l'ai adaptée en fonction pour pouvoir prendre une chaine de texte, et ainsi faire tourner une boucle sur tous les mails. Par contre étrangement, je me retrouve avec le même problème que dans la solution de Paul, à savoir que "July 4, 2017" devient le 07/04/2017.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > stphn
1 août 2017 à 13:37
Re,

Non, non ! ça renvoie bien 04/07/2017. Voir fichier exemple : https://www.cjoint.com/c/GHblKUp1zWc
0
Je suis vraiment étonné. En mode débug, j'ai bien la date qui s'affiche proprement dans la fonction. Même plus, beaucoup de dates s'affichent bien (toutes celles du mois de juin par exemple), mais les premières du mois de juillet ne s'affichent pas comme annoncé dans le débug, mais en version "américaine" : 07/04/2017. Sauf que mon fichier les lit à la française : 7 avril 2017.
Il en va de même pour les dates de début aout (en réalité, toutes celles qui sont en dessous du 12e du mois, où le jour est mal interprété).

Le problème vient peut être de ma transformation en fonction ? Auquel cas, je ne vois pas bien où :

Function FormatDate(chn As String) As Date
Dim MA() As Variant 'déclare la variable MA (Mois Anglais)
Dim AN As Long 'déclare la variable AN (ANnée)
Dim MO As String 'déclare la variable MO (MOis)
Dim JO As Byte 'déclare la variable JO (JOur)
Dim D As Long 'déclare la variable D (Date)
Dim I As Byte 'déclare la variable incrémentale

MA = Array("JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER") 'définit le tableau MA

'voir l'aide sur la fonction SPLIT
AN = CLng(Split(chn, ",")(2)) 'Crée un groupe de 3 (de 0 à 2) mots séparés par la virgule et récupère le troisième groupe (2) = [l'année AN] converti en entier Long
'du second groupe de 3 mots séparés par la virgule  = ["espace", le mois et le jour], sans l'espace devant (avec TRIM),
'crée un goupe de 2 mots séparés par une espace et récupère le premier (0) = [le mois en lettre]
MO = Split(Trim(Split(chn, ",")(1)), " ")(0)
'du second groupe de 3 mots séparés par la virgule  = ["espace", le mois et le jour], sans l'espace devant (avec TRIM),
'crée un goupe de 2 mots séparés par une espace et récupère le second (1) = [le jour] converti en en entier Byte
JO = CByte(Split(Trim(Split(chn, ",")(1)), " ")(1))
For I = 0 To 11 'boucle sur tous les mois du tableau MA
    If UCase(MO) = MA(I) Then Exit For 'si le mois MO (converti en majuscules) est égal au mois de MA, sort de la boucle
Next I 'prochain mois de la boucle
D = DateSerial(AN, I + 1, JO) 'définit la date D en entier long
FormatDate = Format(D, "DD/MM/YYYY\")
End Function
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > stphn
11 août 2017 à 09:54
je pense que la fin de la fonction n'est pas correcte, la dernière ligne (avant
end function
) cause le soucis que tu observes, et est inutile.
Je suggère de supprimer la variable D et de faire:
FormatDate = DateSerial(AN, I + 1, JO) 'définit la date en type date
0
J'ai essayé plusieurs corrections, en condensant effectivement cette dernière ligne, mais aussi en passant les différents éléments en integer (comme stipulé dans la définition de la fonction).
Là où je n'arrive pas à comprendre le problème, c'est qu'en plaçant mes points d'arrêt, je vois bien que ce sont les bonnes informations qui sont remontées à chaque fois. Seulement, les 12 premiers jours du mois inversent jour et mois (et sont lu dans le mauvais sens par excel).
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 29 juil. 2017 à 13:40
bonjour, moi je ferais ainsi (en VBA):
- supprimer la virgule et ce qui précède la virgule
- remplacer le nom du mois par son équivalent en français
- appliquer la fonction cdate au résultat, ou laisser Excel le traiter comme une date
0
C'était ma première solution, mais je ne sais aps pourquoi le format date n'était pas accepté. d'ou ma demande d'aide.
0