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?
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)
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".
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