Если у вас есть строки, содержащие дату, лучше всего конвертировать их в реальные значения Date
.
Вы можете использовать функцию CDate
для преобразования строк в даты, однако есть некоторые подводные камни, например. в зависимости от региональных настроек вашего компьютера формат даты (и порядок дня, месяца и года) может измениться, и CDate
попытается соблюдать эти настройки. Если ваш код выполняется в другой части мира, один и тот же ввод может привести к разным датам. Это, вероятно, причина, по которой вы нашли сложный код, который разбивает строки на части, чтобы получить отдельные части даты.
Дата сохраняется как Double
значение. Целая часть числа определяет дату, начиная с 31.12.1899. Дробная часть представляет время. Чтобы получить разницу между двумя датами, вы можете просто вычесть их.
Теперь возникает вопрос, что вы хотите сделать с разницей. Вы можете написать UDF, который возвращает эту разницу, и отформатировать вашу ячейку, чтобы отображать только часть времени. Просто подумайте, можете ли вы иметь различия> 1 дня. Или вы можете умножить разницу на 24, чтобы получить количество часов, или на 24 * 60, чтобы получить минуты.
UDF может выглядеть как
Function TimeDiff(s1 As String, s2 As String) As Date
Dim d1 As Date, d2 As Date
d1 = CDate(s1)
d2 = CDate(s2)
TimeDiff = IIf(d1 > d2, d1 - d2, d2 - d1)
End Function
Предполагая, что ваша строка даты находится в A1 и B1, вы можете написать формулу =TimeDiff(A1, B1)
в ячейку C1.
Альтернатива для получения количества минут (обратите внимание на другой тип возвращаемого значения):
Function TimeDiffInMinutes(s1 As String, s2 As String) As Long
Dim d1 As Date, d2 As Date, diff As Date
d1 = CDate(s1)
d2 = CDate(s2)
Diff = IIf(d1 > d2, d1 - d2, d2 - d1)
TimeDiffInMinutes = Diff * 24 * 60
End Function
Обе функции не будут иметь проблем, если даты разные.
Если ваш входной формат всегда в форме 01/04/2019 11:38:13
, но CDate будет путать 1 апреля с 4 января, вы можете написать небольшую функцию, которая разбивает строку вручную и создает из нее дату. Просто замените вызов на CDate
на вызов вашей собственной функции преобразования:
Function stringToDate(s As String) As Date
Dim pieces() As String, datePieces() As String, timePieces() As String
pieces = Split(s, " ")
datePieces = Split(pieces(0), "/")
timePieces = Split(pieces(1), ":")
stringToDate = DateSerial(datePieces(2), datePieces(1), datePieces(0)) _
+ TimeSerial(timePieces(0), timePieces(1), timePieces(2))
End Function