Поскольку может быть неоднозначность относительно того, что означает строка типа «010102» (1 января 2002 г. или 2 января 2001 г.), вы можете сначала выполнить итерации по датам, чтобы определить, какая из двух интерпретаций работает для всех других дат.
Здесь я предполагаю, что все даты будут использовать одинаковый формат. Тогда вы можете надеяться, что есть хотя бы одна строка, которую можно интерпретировать только одним способом, например, «000102» может означать только 2 января 2000 года. Поэтому, если вы найдете такой вход, вы можете предположить, что другие входы также находятся в yymmdd формат.
Для этой цели вы можете использовать эту функцию:
Public Function GuessDateFormat(cells As Variant, minDate As Date, maxDate As Date) As String
Dim size As Integer
Dim cellDate As Date
Dim dateFormat As Integer ' 0, 1 or 2
Dim value As String
GuessDateFormat = "inconsistent"
size = Len(cells(1, 1).value)
If size <> 6 And size <> 8 Then Exit Function
For Each cell In cells
value = cell.value
If Len(value) <> size Then Exit Function ' Conflicting format sizes
cellDate = DateSerial(Left(value, size - 4), Mid(value, size - 3, 2), Right(value, 2))
If cellDate < minDate Or cellDate > maxDate Or Format(cellDate, Right("yyyymmdd", size)) <> value Then
dateFormat = dateFormat Or 2 ' format should not be yy[yy]mmdd
End If
cellDate = DateSerial(Right(value, size - 4), Mid(value, 3, 2), Left(value, 2))
If cellDate < minDate Or cellDate > maxDate Or Format(cellDate, Left("ddmmyyyy", size)) <> value Then
dateFormat = dateFormat Or 1 ' format should not be ddmmyy[yy]
End If
If dateFormat = 3 Then Exit Function ' Neither format is possible
Next
GuessDateFormat = Array("ambiguous", Right("yyyymmdd", size), Left("ddmmyyyy", size))(dateFormat)
End Function
Эта функция принимает диапазон (столбец?), который имеет все входные строки. Кроме того, требуется две даты, поэтому вы можете помочь алгоритму исключить форматы, если они приведут к дате, которую вы считаете недопустимой.
Так, например, если ваши входные строки импортированы в диапазоне A1: A10, и вы считаете, что все даты должны быть между 1-1-2000 и сегодняшней датой, то вы бы вызвали вышеуказанную функцию из внутри ячейки, например:
=GuessDateFormat(A1:A10, DATE(2000,1,1), NOW())
Если все в порядке, функция вернет "ddmmyy", "ddmmyyyy", "yymmdd" или "yyyymmdd". Если все входные данные неоднозначны, и невозможно сделать определенный выбор, возвращаемое значение будет «неоднозначным» (неудача!).
Затем вы можете использовать следующую функцию для интерпретации строка как дата, учитывая формат строки:
Function DateFromFormat(dateString As String, srcFormat As String) As Date
Dim dateParts(3) As String
For i = 1 To Len(srcFormat)
j = InStr("ymd", Mid(srcFormat, i, 1))
If j Then dateParts(j) = dateParts(j) + Mid(dateString, i, 1)
Next
DateFromFormat = DateSerial(dateParts(1), dateParts(2), dateParts(3))
End Function
Итак, чтобы развернуть пример, ваш лист может выглядеть так:
A | B
---------+-----------------
19112018 | =DateFromFormat(A1, A$11)
01012002 | =DateFromFormat(A2, A$11)
02022001 | =DateFromFormat(A3, A$11)
03102005 | =DateFromFormat(A4, A$11)
04012020 | =DateFromFormat(A5, A$11)
15052019 | =DateFromFormat(A6, A$11)
19122019 | =DateFromFormat(A7, A$11)
19112019 | =DateFromFormat(A8, A$11)
20012001 | =DateFromFormat(A9, A$11)
06082006 | =DateFromFormat(A10, A$11)
=GuessDateFormat(A1:A10, DATE(2000,1,1), NOW())
В первом столбце есть строки во втором столбце есть даты (не забудьте отформатировать как дату в Excel)
Отсюда вы можете решить, что делать с этими датами, например, отформатировать их в какой-либо формат строки, который вам нравится. Это можно сделать с помощью функции =TEXT()
в Excel.