Excel时间公式

时间:2011-08-09 03:12:14

标签: excel date excel-formula

我试图在时间表上找出进/出时间之间的差异来计算工作时间。

我有以下数据:

----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)是否在第二天。

不幸的是,添加日期不是一个选项......仅限时间。可以编写公式来解决这个限制吗?

3 个答案:

答案 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