22

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

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

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

3 ответа3

19

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

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

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

4

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

0

Функция 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .