Excel Time Forumula - PullRequest
       7

Excel Time Forumula

3 голосов
/ 09 августа 2011

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

У меня есть следующие данные:

----A----------B-----------C----------D-------
----Time In----Time Out----Time In----Time Out
1---11:15 AM---12:05 PM----1:05 PM----1:10 PM
2---1:05 PM----1:20 PM-----2:20 PM----4:00 PM
3---11:35 PM---12:05 AM----1:05 AM----1:30 AM
4---1:20 PM----2:20 PM------------------------

Все эти ячейки отформатированы как время (ЧЧ: ММ AM / PM)

Я использую следующую формулу для расчета отработанных часов:

=(SUM(B1-A1)*24)+(SUM(D1-C1)*24)

Эта формула дает следующие результаты:

----A----------B-----------C----------D-----------E----------
----Time In----Time Out----Time In----Time Out----TOTAL HOURS
1---11:15 AM---12:05 PM----1:05 PM----1:10 PM-----0.92-------
2---1:05 PM----1:20 PM-----2:20 PM----4:00 PM-----1.92-------
3---11:35 PM---12:05 AM----1:05 AM----1:30 AM-----(23.08)----
4---1:20 PM----2:20 PM----------------------------1.00-------

Строки 1, 2 и 4 отображаются правильно, но строка 3 отображается неправильно. Должно быть .92 НЕ -23.08. Я знаю, что это происходит, потому что формула не может сказать, что столбец B (12:05 утра) на следующий день.

К сожалению, добавление даты не вариант ... только время. Можно ли написать формулу, чтобы обойти это ограничение?

Ответы [ 3 ]

5 голосов
/ 09 августа 2011

Возьмите число результата по модулю 24, оно должно постоянно давать вам положительное число.

Ваше уравнение становится:

=MOD(SUM((B1-A1)*24),24) + MOD((SUM(D1-C1)*24),24) 
3 голосов
/ 09 августа 2011

Если результат меньше нуля, добавить 24.

1 голос
/ 09 августа 2011

Я добавляю ответ VBA для тех, кто хочет знать, так как это хороший вопрос, с которым могут столкнуться другие люди. VBA более гибок в том, что у вас могут быть разные форматы времени, и он все равно будет работать (например, у вас могут быть фактические даты, включенные во время). Это использует решение от duffymo.

Function HoursWorked(t1 As Date, t2 As Date, _
                     t3 As Date, t4 As Date) As Double

Application.ScreenUpdating = False
Dim shift1 As Double
Dim shift2 As Double

shift1 = DateDiff("n", t1, t2) / 60
If shift1 < 0 Then
    shift1 = shift1 + 24
End If

shift2 = DateDiff("n", t3, t4) / 60
If shift2 < 0 Then
    shift2 = shift2 + 24
End If

HoursWorked = shift1 + shift2
Application.ScreenUpdating = True

End Function

Обратите внимание, что если смены 3 и 4 не заполнены, функция все равно будет работать нормально. Также обратите внимание, что я использовал секунды, затем разделенные на 60, чтобы гарантировать, что точность не будет потеряна (что было бы, если бы вы использовали «h» вместо «n» в функции DateDiff).

И если вы просто хотите узнать количество часов между двумя датами / временем, вы можете использовать это:

Function HoursDiff(ByVal date1 As Date, _
                   ByVal date2 As Date) As Double

Application.ScreenUpdating = False
Dim result As Double

result = DateDiff("n", date1, date2) / 60
If result < 0 Then
    result = result + 24
End If

HoursDiff = result
Application.ScreenUpdating = True

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...