Salut.
Outre le fait que je considère ce format de date comme ésotérique (en général, soit on exprime le mois en numérique avec des séparateurs ( / - . ) soit on l'exprime littéralement sans séparateur) et en étant étonné que l'année soit parfois en deux chiffres et parfois en quatre, en considérant les dates exprimées selon les schémas suivants (
à l'exclusion de toute autre fioriture de format, puisque telle n'est pas la demande initiale), et en devant éventuellement adapter les abréviations des mois en fonction d'une liste d'exemples couvrant l'année entière (au moins un exemple par mois), on peut utiliser une fonction qui récupère la date et l'heure de la journée. J'ai dû supposer que lorsqu'on est le matin, on trouve AM en fin de chaine. Il me semble évident au vu des exemples que les dates sont exprimées au format européen, c'est-à-dire dans l'ordre J/M/A.
La fonction perso GetDate récupère la chaine exprimant la date et utilise la fonction getMonth.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| Function GetDate(Text As String) As Date
Dim strDay As String, strMonth As String, strYear As String
Dim tmpDate As String, tmpTime As String
Dim intMonth As Integer
Dim tmp As Date
Dim PartOfDay As String
tmpDate = Split(Text, " ")(0)
tmpTime = Split(Text, " ")(1)
PartOfDay = Split(Text, " ")(2)
strDay = Split(tmpDate, "/")(0)
strMonth = Split(tmpDate, "/")(1)
strYear = Split(tmpDate, "/")(2)
intMonth = getMonth(strMonth)
tmp = DateSerial(strYear * 1, intMonth, strDay * 1)
tmp = tmp + CDate(tmpTime)
If PartOfDay = "PM" Then tmp = tmp + 0.5
GetDate = tmp
End Function
Function getMonth(strMonth As String) As Integer
Dim Months
Dim Found As Boolean
Dim Counter As Long
Months = Array("janv", "fév", "mar", "avr", "mai", "juin", "juil", "aou", "sept", "oct", "nov", "déc")
Counter = 0
Do While Counter < 11 And Not Found
If strMonth Like Months(Counter) & "*" Then Found = True
Counter = Counter + 1
Loop
If Found Then getMonth = Counter
End Function |
Cette fonction perso getDate peut être utilisée en Excel ou en VBA, et offre l'avantage de convertir
en date la chaîne passée, pour autant qu'elle soit valide. Je n'ai pas fait de tests de validité de la chaine passée, car en général, une extraction d'une DB ou d'un fichier respecte un format constant (d'où mon étonnement de l'année sur deux ou quatre chiffres). C'est aussi la raison pour laquelle ma fonction n'est pas générique (je ne traite qu'un séparateur, les dates sont données au même format, il y a toujours le moment de la journée suivi de AM ou de PM). La transformation de la chaine en date permet de récupérer n'importe quelle donnée de cette date (jour, mois, année, heures, minutes, secondes) sans avoir besoin d'artifices tels que tableaux et paramètres proposés par ailleurs, et permet donc le traitement des dates récupérées avec les fonctions natives d'Excel ou de VBA, telles que année(), mois(), jour(),...), voire même de DateDif (fonction non documentée d'Excel) ou DateDiff (VBA).
L'illustration suivante permet de visualiser l'utilisation de la fonction dans Excel, et la liste déroulante des formats illustre bien que nous sommes en présence d'une valeur de type date/heure. Je pense qu'avec cela, Spy a toutes les cartes en mains.
Spy, pour ma curiosité personnelle, d'où proviennent ces dates au format "inhabituel"?
Partager