Я разделил вашу задачу на 3 функции.
a) вспомогательная функция преобразует 3 символа месяца в целое число.Это выглядит немного неуклюже, могут быть и другие подходы, но преимущество использования большого Select Case
в том, что его легко понять и легко адаптировать, если появляются названия месяцев на другом языке:
Function getMonthFromName(monthName As String) As Integer
Select Case UCase(monthName)
Case "JAN": getMonthFromName = 1
Case "FEB": getMonthFromName = 2
Case "MAR": getMonthFromName = 3
Case "APR": getMonthFromName = 4
(...)
Case "SEP": getMonthFromName = 9
(...)
End Select
End Function
b) функция, которая преобразует строку в дату.Предполагается, что формат даты указан в предоставленной вами форме, но он легко адаптируется, если формат изменяется (для простоты, секунды округлены)
Function GetDateFromString(dt As String) As Date
Dim tokens() As String
tokens = Split(Replace(dt, ":", " "), " ")
Dim day As Integer, month As Integer, year As Integer
month = getMonthFromName(CStr(tokens(0)))
day = Val(tokens(1))
year = Val(tokens(2))
Dim hour As Integer, minute As Integer, second As Double
hour = Val(tokens(3))
minute = Val(tokens(4))
second = Round(Val(tokens(5)), 0)
GetDateFromString = DateSerial(year, month, day) + TimeSerial(hour, minute, second)
End Function
c) Функция, которая рассчитала разницу между двумя датами.в секундахДата в VBA (и многих других средах) хранится как Double
, где Date-Part является целочисленной частью, а date является оставшейся частью.Это позволяет легко рассчитать с помощью значений даты.
Function DateDiffInSeconds(d1 As String, d2 As String) As Long
Dim diff As Double
diff = GetDateFromString(d2) - GetDateFromString(d1)
DateDiffInSeconds = diff * 24 * 60 * 60
End Function
Обновление для работы с миллисекундами: измените функцию GetDateFromString
.В этом случае DateDiffInSeconds
должен вернуть double
, а не long
.
Function GetDateFromString(dt As String) As Date
Const MillSecPerHour As Long = 24& * 60 * 60 * 1000
Dim tokens() As String
tokens = Split(Replace(Replace(dt, ".", " "), ":", " "), " ")
Dim day As Integer, month As Integer, year As Integer
month = getMonthFromName(CStr(tokens(0)))
day = Val(tokens(1))
year = Val(tokens(2))
Dim hour As Integer, minute As Integer, second As Integer, milli As Integer
hour = Val(tokens(3))
minute = Val(tokens(4))
second = Val(tokens(5))
milli = Val(tokens(6))
GetDateFromString = DateSerial(year, month, day) _
+ TimeSerial(hour, minute, second) _
+ milli / MillSecPerHour
End Function