Как мне разобрать нестандартный формат даты в Excel?


24

У меня есть столбец даты, как строковые значения в формате yyyy-mm-dd, например 2011-Sep-13. Мне нужно преобразовать их в серийные номера дат Excel, чтобы использовать их в формулах.

DATEVALUE не может распознать этот формат; Я просто получаю, #VALUE!когда пытаюсь. Он также не принимает пользовательский формат даты (в отличие от большинства языков программирования).

Как я могу преобразовать произвольные форматы даты в значения даты Excel?

Ответы:


21

Вам нужно будет выполнить синтаксический анализ строки, а затем передать соответствующее отформатированное значение в DATEVALUE- что-то вроде этого:

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

(редактировать: обновленная формула - проверено и у меня работает на одном примере - может потребоваться уточнение в зависимости от вашего ввода)


1
+1: у меня было это в буфере обмена, готовое к работе, когда вы отправили: = DATEVALUE (RIGHT (A1,2) и MID (A1, FIND ("-", A1), 5) и MID (A1,3,2))
Excellll

Хех, я никогда не думал просто переставлять биты. Благодарность!
Крейг Уокер,

2
Через 8 лет и несколько версий Excel, это по-прежнему самый актуальный ответ! Я желаю, чтобы Excel мог обеспечить функциюPARSEDATE([string_value], [date format])
Ману Манджунатх

5

Обратите внимание, что названия месяцев зависят от региональных параметров Windows. Итак, если ваши региональные параметры Windows установлены на украинский, то DATEVALUE вернет #VALUE! на «07-ноя-2012», но примет «07-Лис-2012».


1
Очень очень важное примечание! Жаль, что Excel не распознает обе региональные настройки + английские названия месяца / дня по умолчанию
athanassis

1

Функция Excels DateValue зависит от региона. Если вы проанализируете строку типа «04-11-2008» в Европе, она будет проанализирована 4 ноября, а в США - 11 апреля.

Чтобы обойти это, вы можете использовать функцию DateSerial и выполнить анализ самостоятельно. Это также может быть легко адаптировано к вашему нестандартному формату даты.

' 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.