我试图在时间表上找出进/出时间之间的差异来计算工作时间。
我有以下数据:
----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------------------------
这些单元格都被格式化为时间(HH:MM 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和第1行4显示正常,但第3行显示错误。它应该是.92 NOT -23.08。我知道这种情况正在发生,因为公式无法判断B列(12:05 AM)是否在第二天。
不幸的是,添加日期不是一个选项......仅限时间。可以编写公式来解决这个限制吗?
答案 0 :(得分:5)
取结果数模24,它应该一直给你一个正数。
你的等式变为:
=MOD(SUM((B1-A1)*24),24) + MOD((SUM(D1-C1)*24),24)
答案 1 :(得分:3)
如果结果小于零,则添加24。
答案 2 :(得分:1)
我正在为那些可能想知道的人添加一个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以确保精度不会丢失(如果你在“DateDiff”函数中“h”而不是“n”则会这样。)
如果您只想获得2个日期/次之间的小时数,可以使用:
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