2011-08-09 74 views
3

我试图找出时间表上的进/出时间以计算工作时间的差异。Excel时间论坛

,我有以下数据:

----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,& 4显示正常,但行3显示错误。它应该是.92不是-23.08。我知道这是因为公式无法确定列B(12:05 AM)在第二天。

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

回答

5

取结果数模24,它应该给你一个正数,所有的时间。

您的公式变为:

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

您在SUM之后缺少一个括号,但很好的答案!应该是:= MOD(SUM((B1-A1)* 24),24)+ MOD((SUM(D1-C1)* 24),24) – aevanko

+0

@Issun谢谢!我会解决它 – Pepe

3

如果结果小于零,添加24

+0

+1。在我的vba答案中使用你的解决方案。 :) – aevanko

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