vba excel datediff вычисляет разные результаты

#excel #vba

#excel #vba

Вопрос:

Я пытаюсь рассчитать разницу во времени в часах между двумя временами.

Но я не получаю ожидаемый результат, на самом деле одна и та же функция выдает мне два разных результата.

время между 14:22:00 и 22:57:48 должно составлять 8 часов 35 минут и 48 секунд. Однако я получаю два разных числа.

Если я сохраняю значение как дату, я получаю 14: 19:12, Если я вычисляю в msgbox на ходу, я получаю 8,5966…

Ни то, ни другое не является правильным, или, может быть, он использует какой-то формат, о котором я не знаю. На скриншоте показаны как msgbox, так и тест хранилища. Также опубликовано в ожидаемом результате.

Есть предложения?

Datediff

 
Public Sub DDtest()

Dim EDay As Date
Dim ETime As Date
Dim DtgA As Date

EDay = Format(CDate(Replace(Worksheets("Data2020").Range("E2").Value, ".", "/")), "dd-mmm-yyyy")
ETime = Format(Worksheets("Data2020").Range("F2"), "hh:mm:ss")
DtgA = EDay   ETime

Dim EDay2 As Date
Dim ETime2 As Date
Dim DtgB As Date

EDay2 = Format(CDate(Replace(Worksheets("Data2020").Range("E3").Value, ".", "/")), "dd-mmm-yyyy")
ETime2 = Format(Worksheets("Data2020").Range("F3"), "hh:mm:ss")
DtgB = EDay2   ETime2

Dim result As Date
result = Format(DateDiff("s", DtgA, DtgB) / (60 * 60), "hh:mm:ss")

MsgBox "Date 1:" amp; DtgA amp; vbNewLine amp; "Date 2:" amp; DtgB amp; vbNewLine amp; vbNewLine amp; DateDiff("s", DtgA, DtgB) / (60 * 60) amp; vbNewLine amp; result


End Sub
  

Комментарии:

1. Пожалуйста, никогда не публикуйте свой код в виде изображения. Отредактируйте свой вопрос и скопируйте / вставьте свой код.

2. Добавляя к комментариям @FoxfireAndBurnsAndBurns, каковы значения в диапазоне E2, F2, E3,F3 ?

3. Добавлен код.. Столбец E — это просто дата, т.Е. В данном случае 12.12.2019, затем я заменяю на -, потому что он не будет работать с. в качестве разделителя преобразуйте в дату и формат. F colum — это время..

4. Но вопрос в том, почему DateDiff выдает два разных результата с использованием одних и тех же чисел.

5. казалось бы, 8,5966 часов — это тот ответ, который вы ищете. Поскольку даты хранятся в виде чисел, где целое число представляет количество дней от 1/1/1900, а десятичная часть является частью дня, часть 0,5966 одного дня, отформатированная как время, дает вам сразу после 2 часов дня.

Ответ №1:

DateDiff("s", DtgA, DtgB) / (60 * 60) вернет десятичное значение, в данном случае 8.59666666666667 часы

Когда вы применяете Format для его преобразования hh:mm:ss , значение 8.59666666666667 не обрабатывается как часы. Excel считает, что это десятичное значение, которое должно быть преобразовано в дату, и оно обрабатывается как дни.

В Excel даты всегда являются числами. Целочисленная часть — это сама дата, а десятичная часть — это время, часть этого дня, но не сам день.

В первый день Excel может использовать is 01/01/1900 , а числовое значение равно 1, 2 02/01/1900 и так далее.

Итак, Excel считает 8.59666666666667 , что 08/01/1900 14:19:12

Если вы разделите эти часы на 24, вы получите правильный результат:

 result = Format(DateDiff("s", DtgA, DtgB) / (60 * 60) / 24, "hh:mm:ss")
  

Вы получаете это:

введите описание изображения здесь

Обратите внимание, что первое значение является десятичным значением, а второе форматируется как hh:mm:ss . Но оба они показывают одно и то же значение в разном формате.

ОБНОВЛЕНИЕ: На самом деле, если вы заставите значения ваших дат отличаться ровно на 8 с половиной часов, вы прекрасно увидите, как работает Excel. То же значение, но в другом формате.

Я заставил даты быть 12/12/2019 14:22:00 и 12/12/2019 22:52:00 и я получаю это:

введите описание изображения здесь

Ровно 8 с половиной часов, но сначала в десятичном, а затем в десятичном формате hh:mm:ss .

Комментарии:

1. Я снимаю шляпу.. Вы, сэр, чемпион. Спасибо, что нашли время, чтобы объяснить изменение и как я могу заставить его работать. Действительно оценено.

Ответ №2:

Почему вы форматируете перед вычислением? Если значение ячейки равно дате, форматирование не учитывается.

дата и время = 441040.598611111111111

 Sub calcDatediff()
    date1 = Worksheets("masterdata").Range("C11")
    time1 = Worksheets("masterdata").Range("D11")
    date2 = Worksheets("masterdata").Range("C12")
    time2 = Worksheets("masterdata").Range("D12")

    dtime1 = date1   time1
    dtime2 = date2   time2
    difftime = Format(dtime2 - dtime1, "HH:mm:ss", vbMonday, vbFirstFourDays)
End Sub
  

Комментарии:

1. Это затрагивает основную проблему и является ответом.

2. Это не моя таблица, и в ней ужасный беспорядок, где есть смешанные поля, смешанные разделители, очистка и создание новой таблицы для использования. 🙁 Вот почему форматирование.