web-dev-qa-db-fra.com

Comment analyser un format de date non standard dans Excel?

J'ai une colonne de valeurs de type chaîne de type date au format yyyy-mm-dd, telle que 2011-Sep-13. Je dois convertir ces données en numéros de série de date Excel afin de pouvoir les utiliser dans des formules.

DATEVALUE n'est pas capable de reconnaître ce format. Je viens d'obtenir #VALUE! lorsque j'essaie. De plus, il ne prend pas de format de date personnalisé (contrairement à la plupart des langages de programmation).

Comment convertir des formats de date arbitraires en valeurs de date Excel?

22
Craig Walker

Vous devrez analyser les chaînes, puis transmettre une valeur formatée appropriée à DATEVALUE- quelque chose comme ceci:

=DATEVALUE(RIGHT(A1,2)&"-"&MID(A1,6,3)&"-"&LEFT(A1,4))

(edit: formule mise à jour - testé et cela fonctionne pour moi sur un exemple - peut-être besoin d'affiner en fonction de votre entrée)

19
Aerik

Notez que les noms de mois sont spécifiques aux options régionales Windows. Ainsi, si vos options régionales Windows sont définies sur Ukrainien, DATEVALUE renverra #VALUE! pour "07-Nov-2012", mais accepterait "07-Лис-2012".

5
Olexa

La fonction Excelle DateValue dépend de la région. Si vous analysez une chaîne du type "04-11-2008" en Europe, celle-ci sera analysée le 4 novembre et les États-Unis le 11 avril.

Pour résoudre ce problème, vous pouvez utiliser la fonction DateSerial et vous analyser vous-même. Cela peut également être facilement adapté à votre propre format de date non standard.

' Region independent date parsing
' Expects a datetimestr in the format  "04-11-2008 21:39:39"
' The function VBA.DateTime.DateValue() mixes up the date and month in different regions
Function parseDateTime(dateTimeStr As String) As Date

    Dim parts As Variant
    parts = VBA.Strings.Split(dateTimeStr, " ")

    Dim datePart As String, timePart As String
    datePart = parts(0)
    timePart = parts(1)

    Dim dateParts As Variant, day As Integer, month As Integer, year As Integer
    dateParts = VBA.Strings.Split(datePart, "-")
    day = dateParts(0)
    month = dateParts(1)
    year = dateParts(2)

    Dim parsed_date As Date, parsed_time As Date
    parsed_date = VBA.DateTime.DateSerial(year, month, day)
    parsed_time = VBA.DateTime.TimeValue(timePart)

    parseDateTime = parsed_date + parsed_time
End Function
0
CodeKid