#excel #vba
#excel #vba
Вопрос:
Я пытаюсь рассчитать разницу во времени в часах между двумя временами.
Но я не получаю ожидаемый результат, на самом деле одна и та же функция выдает мне два разных результата.
время между 14:22:00 и 22:57:48 должно составлять 8 часов 35 минут и 48 секунд. Однако я получаю два разных числа.
Если я сохраняю значение как дату, я получаю 14: 19:12, Если я вычисляю в msgbox на ходу, я получаю 8,5966…
Ни то, ни другое не является правильным, или, может быть, он использует какой-то формат, о котором я не знаю. На скриншоте показаны как msgbox, так и тест хранилища. Также опубликовано в ожидаемом результате.
Есть предложения?
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. Это не моя таблица, и в ней ужасный беспорядок, где есть смешанные поля, смешанные разделители, очистка и создание новой таблицы для использования. 🙁 Вот почему форматирование.