Visual Basic for Applications:
Разбор даты из строки

Как это сделать:

VBA предлагает простой способ разбора строки в дату с использованием функции CDate или функции DateValue. Однако крайне важно, чтобы строка была в узнаваемом формате даты.

Вот простой пример с использованием CDate:

Sub ParseDateUsingCDate()
    Dim dateString As String
    Dim parsedDate As Date
    
    dateString = "2023-04-01"
    parsedDate = CDate(dateString)
    
    Debug.Print "Разобранная дата: "; parsedDate
End Sub

Если вы запустите этот код, вывод в окне Immediate (доступно через Ctrl+G в редакторе VBA) будет:

Разобранная дата: 4/1/2023 

В качестве альтернативы можно использовать функцию DateValue, которая более специфична для дат (игнорируя часть времени):

Sub ParseDateUsingDateValue()
    Dim dateString As String
    Dim parsedDate As Date
    
    dateString = "1 апреля 2023"
    parsedDate = DateValue(dateString)
    
    Debug.Print "Разобранная дата с использованием DateValue: "; parsedDate
End Sub

Пример вывода для этого случая также будет показан в окне Immediate:

Разобранная дата с использованием DateValue: 4/1/2023

Имейте в виду, что успех разбора зависит от соответствия формата даты строки системным или прикладным настройкам.

Подробный анализ

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

Исторически обработка дат была обычным источником ошибок в приложениях, особенно в тех, которые используются на международном уровне. Эта зависимость от региональных настроек в VBA - одна из причин, по которой некоторые могут рассматривать альтернативы, такие как формат ISO 8601 (например, “ГГГГ-ММ-ДД”) для однозначного представления и разбора дат на разных системах. К сожалению, VBA нативно не поддерживает ISO 8601, и для строгого соответствия потребуется ручной разбор.

Для сложного разбора дат, выходящего за рамки возможностей CDate или DateValue, или для обеспечения одинакового разбора независимо от настроек локали системы, программисты могут прибегать к пользовательским функциям разбора. Это может включать разделение строки даты на компоненты (год, месяц, день) и создание даты с использованием функции DateSerial. Другие могут выбрать более мощные языки или библиотеки, разработанные с учетом интернационализации для таких задач.