Из предыдущих вопросов на этом и других сайтах мне была дана функция, которая может анализировать и находить даты в текстовых строках или ячейках. Вот функция:
Function GetDate(strInput As String) As Date
Dim DateFormat() As String
Dim intDateLength As Integer
Dim intMaxFormat As Integer
Dim intFrmtCtr As Integer
Dim intPosition As Integer
intMaxFormat = 6
ReDim DateFormat(1 To intMaxFormat)
DateFormat(1) = "*##[-/]##[/-]####*"
DateFormat(2) = "*#[-/]##[-/]####*"
DateFormat(3) = "*##[-/]#[-/]####*"
DateFormat(4) = "*##[-/]##[-/]##*"
DateFormat(5) = "*#[-/]##[-/]##*"
DateFormat(6) = "*#[-/]#[-/]##*"
GetDate = Now
For intFrmtCtr = 1 To intMaxFormat
If strInput Like DateFormat(intFrmtCtr) Then
intDateLength = Len(DateFormat(intFrmtCtr)) - 8
strInput = Replace(strInput, " ", "")
For intPosition = 1 To Len(strInput)
If Mid(strInput, intPosition, intDateLength) Like DateFormat(intFrmtCtr) Then
GetDate = DateValue(Mid(strInput, intPosition, intDateLength))
Exit Function
End If
Next intPosition
End If
Next intFrmtCtr
End Function
Затем это вызывается путем ссылки на адрес ячейки:
'Gets date from cell A2
Range("A2").Select
dateWork = GetDate(Selection)
Затем я могу отформатировать вывод с помощью Format(dateWork, "mmddyy")
или аналогичным.
В приведенном выше случае, учитывая содержимое ячейки от 8/31/2011
строка 08312011
.
Однако, начиная с дат содержимого ячеек с одним числом дня (т. Е. В начале месяца), функция начала возвращать первые две цифры года вместо вторых двух цифр. Внезапно даты начали выглядеть так, как будто они были в 2020 году, а не в 2011 году.
Я смог проверить это, используя идентичные входные таблицы с данными, где даты до 8/31/2011
были возвращены правильно, а даты, начинающиеся с 9/1/2011
и продолжающиеся, возвращают "20" как год.
Где эта функция ломается?
ОБНОВЛЕНИЕ уточнения по вопросам:
Я использую эту функцию в нескольких макросах, действующих на данные, экспортированные из инструмента генерации отчетов (Business Objects). Можно вручную редактировать дату во входных файлах, но это скорее противоречит назначению макросов и поэтому не должно рассматриваться как вариант.
Функция GetDate() может быть вызвана для поиска дат в любой строке. Строки могут быть просто датой в любом из различных форматов или могут представлять собой комбинации текста и даты, например «Итоги по состоянию на 13.09.1977».
Буду признателен за ваше упрощение или внесение изменений в функцию, если она сохраняет способности, изложенные выше.