Преобразовать строку в дату и время в Excel с отдельным параметром формата (например, TO_DATE, DateTime.ParseExact)? - PullRequest
0 голосов
/ 27 октября 2018

Существует ли функция, которая преобразует строку в дату и время, используя формат даты и времени, заданный в качестве параметра в Excel?

Вы можете представить это как функции ниже на разных платформах:

PLSQL: TO_DATE("20191301","YYYYDDMM")
C#: DateTime.ParseExact("20191301","YYYYDDMM", null)

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

На основании указанной вами строки

Ячейка А1

29.10.2018:17:48:10

Используйте это

=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))
0 голосов
/ 28 февраля 2019

Вот попытка пользовательской функции листа:

  • Функция возвращает значение даты и времени
  • Поддерживаемые форматные строки: гггг, гг, ммм, мм, дд, чч, мм, сс
  • утра, часа ночи, а. м., вечера, п.м., с. м. и их заглавные буквы эквивалентны
  • Только MM (месяц) и мм (минута) чувствительны к регистру,
    МММ или ммм равны январю, февралю, ...
  • Двузначные годы ниже 80 - это 20xx, 80 или выше - 19xx
  • Формат-строка должна иметь ту же длину, что и исходная строка,
    в противном случае возвращает # N / A error
  • Заполняющие символы могут быть пустыми, двоеточием, двойным двоеточием или еще

Примеры: TO_DATE DateTime.ParseExact examples in VBA

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
0 голосов
/ 27 октября 2018

Может быть, эта функция возвращает результат по вашему желанию (вы можете изменить в соответствии с требованиями)

Function Convert2Date(s) As Date
Dim a           As Variant

a = Split(s, "/")
Convert2Date = DateSerial(a(2), a(1), a(0))
End Function
...