Проблема здесь в том, как вы определили res
.
Даты и значения времени являются числами. Даже если вы видите его как 30/09/2019
или 12:00:00
, фактически для Excel оба случая являются числами.
Первая дата, которую Excel может правильно распознать, - 01.01.1900, целое числовое значение которой равно 1. Число2 будет 01.02.1900 и так далее. На самом деле, сегодня 43738.
Для времен то же самое, но десятичные части - это часы, минуты и секунды. 0,5 означает 12:00:00
. Итак, на самом деле 43738,5 означает 30/09/2019 12:00:00
.
В любом случае, в вашем случае вы получаете разницу во времени между 2 разами в минутах. В результате получается 960, , но вы присваиваете это значение типу date
, поэтому 960 преобразуется в 17/08 / 1902.
Dim h1 As Date
Dim h2 As Date
Dim res As Single
h1 = TimeValue("06:00:00")
h2 = TimeValue("22:00:00")
res = DateDiff("n", h1, h2)
Debug.Print res
Код выше вернет960
правильно. Адаптируйте его под свои нужды.
ОБНОВЛЕНИЕ: Поскольку DateDiff возвращает Long, определение res
как Single
вообще не стоит . Я сделал это потому, что для работы со временем во многих случаях требуются десятичные дроби, но если вы используете просто DateDiff
, то вы можете прекрасно сделать res as Long
или res as Integer
.
Обратите внимание на разницу между DateDiff и обычным вычитанием с простым кодом:
Dim time1 As Date
Dim time2 As Date
Dim res1 As Integer
Dim res2 As Single 'or double if you wish
time1 = "06:00:00"
time2 = "06:30:30"
'time difference between these 2 values are 30 minutes and 30 seconds (30,5 minutes in decimal)
res1 = DateDiff("n", time1, time2)
res2 = (time2 - time1) * 1440 '1440 is the number of minutes in a whole day
Debug.Print "With DateDiff:" & res1, "Normal: " & res2
Вывод этого кода: With DateDiff:30 Normal: 30,5
Использование DateDiff
иногда не стоит. В зависимости от того, насколько точный вам нужен результат, DateDiff
может компенсировать или нет. Я бы посоветовал вам избежать этого, если вы можете (это просто мое мнение)
Надеюсь, это поможет
ОБНОВЛЕНИЕ 2: О коде выше, да, решениебудет использовать DateDiff("s", time1, time2) / 60
, чтобы преобразовать секунды в минуты, но это значение из-за десятичных разрядов должно быть присвоено типу данных, который это позволяет.