Вот попытка пользовательской функции листа:
- Функция возвращает значение даты и времени
- Поддерживаемые форматные строки: гггг, гг, ммм, мм, дд, чч, мм, сс
- утра, часа ночи, а. м., вечера, п.м., с. м. и их заглавные буквы эквивалентны
- Только MM (месяц) и мм (минута) чувствительны к регистру,
МММ или ммм равны январю, февралю, ...
- Двузначные годы ниже 80 - это 20xx, 80 или выше - 19xx
- Формат-строка должна иметь ту же длину, что и исходная строка,
в противном случае возвращает # N / A error
- Заполняющие символы могут быть пустыми, двоеточием, двойным двоеточием или еще
Примеры:
EDIT:
Public Function TO_DATE(ByRef src As String, ByRef frmt As String) As Variant
Dim y As Long, m As Long, d As Long, h As Long, min As Long, s As Long
Dim am As Boolean, pm As Boolean
Dim pos As Long
If Len(src) <> Len(frmt) Then
TO_DATE = CVErr(xlErrNA) ' #N/A error
Exit Function
End If
pos = InStr(1, frmt, "yyyy", vbTextCompare)
If pos > 0 Then
y = Val(Mid(src, pos, 4))
Else: pos = InStr(1, frmt, "yy", vbTextCompare)
If pos > 0 Then
y = Val(Mid(src, pos, 2))
If y < 80 Then y = y + 2000 Else y = y + 1900
End If
End If
pos = InStr(1, frmt, "mmm", vbTextCompare)
If pos > 0 Then
m = month(DateValue("01 " & (Mid(src, pos, 3)) & " 2000"))
Else: pos = InStr(1, frmt, "MM", vbBinaryCompare)
If pos > 0 Then m = Val(Mid(src, pos, 2))
End If
pos = InStr(1, frmt, "dd", vbTextCompare)
If pos > 0 Then d = Val(Mid(src, pos, 2))
pos = InStr(1, frmt, "hh", vbTextCompare)
If pos > 0 Then h = Val(Mid(src, pos, 2))
If InStr(1, src, "am", vbTextCompare) > 0 Then am = True
If InStr(1, src, "a.m.", vbTextCompare) > 0 Then am = True
If InStr(1, src, "a. m.", vbTextCompare) > 0 Then am = True
If InStr(1, src, "pm", vbTextCompare) > 0 Then pm = True
If InStr(1, src, "p.m.", vbTextCompare) > 0 Then pm = True
If InStr(1, src, "p. m.", vbTextCompare) > 0 Then pm = True
If am And h = 12 Then h = 0
If pm And h <> 12 Then h = h + 12
pos = InStr(1, frmt, "mm", vbBinaryCompare)
If pos > 0 Then min = Val(Mid(src, pos, 2))
pos = InStr(1, frmt, "ss", vbTextCompare)
If pos > 0 Then s = Val(Mid(src, pos, 2))
TO_DATE = DateSerial(y, m, d) + TimeSerial(h, min, s)
End Function