Como eu analiso um formato de data fora do padrão no Excel?

22

Eu tenho uma coluna de valores de sequência de data no formato yyyy-mm-dd , como 2011-Sep-13 . Eu preciso convertê-los para números de série de data do Excel para que eu possa usá-los em fórmulas.

DATEVALUE não consegue reconhecer este formato; Acabei de receber #VALUE! quando tento. Ele também não aceita um formato de data personalizado (diferente da maioria das linguagens de programação).

Como posso converter formatos de data arbitrários em valores de data do Excel?

    
por Craig Walker 13.09.2011 / 19:59

3 respostas

19

Você precisará fazer a análise de string e, em seguida, passar um valor formatado apropriado para DATEVALUE - algo assim:

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

(editar: fórmula atualizada - testada e funciona para mim em um exemplo - pode ser necessário refinar dependendo da sua entrada)

    
por 13.09.2011 / 20:04
4

Observe que os nomes dos meses são específicos das Opções Regionais do Windows. Portanto, se as opções regionais do Windows estiverem definidas como ucraniano, DATEVALUE retornará #VALUE! para "07-Nov-2012", mas aceitaria "07-Лис-2012".

    
por 07.11.2012 / 13:36
0

Excels A função DateValue depende da região. Se você analisar uma string como "04-11-2008" na Europa que seria analisada como 4 de novembro e nos EUA como 11 de abril.

Para contornar isso, você pode fazer uso da função DateSerial e fazer a análise você mesmo. Isso também pode ser facilmente adaptado ao seu formato de data não padrão.

' 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
    
por 21.08.2018 / 11:50