我遇到以下问题时遇到了困难。 我有以下excel电子表格:link
我需要一个Excel公式来计算特定时间段(20:00
和05:00
之间,开始日期和结束之间所花费的总时间日期例如:
(改为清晰:)
TIME SPAN:
Start_TimeStanmp
2018/04/04 00:12:53
End_TimeStamp
2018/04/16 13:24:04
每日换档:
"Shift" Start
20:00:00
"Shift" End
05:00:00
TIME DAN的总小时数是什么?
答案 0 :(得分:2)
可能有一种更简单的方法,但是这个UDF应该可以解决这个问题:
Function hoursBetween(startDT As Date, stopDT As Date, timeStart As Date, timeStop As Date) As Single
Dim dt As Date, thisStart As Date, thisStop As Date
For dt = Int(startDT) To Int(stopDT) + IIf(timeStop < timeStart, -1, 0)
thisStart = timeStart
thisStop = timeStop
If timeStart < timeStop Then
Select Case dt
Case Int(startDT) 'its the 1st day of the range
thisStart = IIf(startDT - Int(startDT) > timeStart Or (timeStart < timeStop), startDT - Int(startDT), timeStart)
Case Int(stopDT) 'its the last day of the range
thisStop = IIf(stopDT - Int(stopDT) < timeStop, stopDT - Int(stopDT), timeStop)
End Select
Debug.Print dt & " : " & thisStart & " to " & thisStop
Else
'the day crosses midnight
Select Case dt
Case Int(startDT) 'its the 1st day of the range
thisStart = IIf(startDT - Int(startDT) > timeStart, timeStart, startDT - Int(startDT))
Case Int(stopDT) 'its the last day of the range
thisStop = IIf(stopDT - Int(stopDT) > timeStop, timeStop, stopDT - Int(stopDT))
End Select
End If
thisStart = thisStart + dt
thisStop = thisStop + dt
If thisStop < thisStart Then thisStop = thisStop + 1
hoursBetween = hoursBetween + ((thisStop - thisStart) * 24)
Debug.Print dt & " : " & thisStart & " to " & thisStop, "Day hrs: " & ((thisStop - thisStart) * 24)
Next dt
End Function
使用您的示例进行测试:
Sub test()
Debug.Print hoursBetween(#2018/04/04 00:12:53#, #2018/04/16 13:24:04#, #20:00#, #05:00#)
End Sub
注意&#34;不知道&#34;如果班次时间总是像你的例子一样跨越午夜,则需要两倍的代码量......(尽管有可能简化它的方法。)
04-04 : 04-04 12:12:53 to 04-04 05:00:00 Day hrs: 4.79
04-05 : 04-05 20:00:00 to 04-06 05:00:00 Day hrs: 9
04-06 : 04-06 20:00:00 to 04-07 05:00:00 Day hrs: 9
04-07 : 04-07 20:00:00 to 04-08 05:00:00 Day hrs: 9
04-08 : 04-08 20:00:00 to 04-09 05:00:00 Day hrs: 9
04-09 : 04-09 20:00:00 to 04-10 05:00:00 Day hrs: 9
04-10 : 04-10 20:00:00 to 04-11 05:00:00 Day hrs: 9
04-11 : 04-11 20:00:00 to 04-12 05:00:00 Day hrs: 9
04-12 : 04-12 20:00:00 to 04-13 05:00:00 Day hrs: 9
04-13 : 04-13 20:00:00 to 04-14 05:00:00 Day hrs: 9
04-14 : 04-14 20:00:00 to 04-15 05:00:00 Day hrs: 9
04-15 : 04-15 20:00:00 to 04-16 05:00:00 Day hrs: 9
Total: 103.7853
答案 1 :(得分:1)
这是一个更简单/非VBA的方法,因为ashleedawg可能存在:(我将A1
用作开始日期,B1
用作结束日期)
&#34;棘手&#34;这里的部分是每个班次跳过午夜 - 为了纠正这个问题,我将从所有日期时间中减去开始时间(Time(20,0,0)
)到零。
从&#34;全天开始&#34;伯爵 - 所以,&#34; 23日至25日&#34;是&#34; 2天&#34; - 然后将其乘以&#34;每天的小时数&#34; :( MOD
将自动校正班次是否越过午夜)
=(Int(B1-Time(20,0,0))-Int(A1-Time(20,0,0)))*Mod(1+Time(5,0,0)-Time(20,0,0),1)
接下来,我们需要从第一天起调整任何预启动时间。因为我们将开始时间调整为&#34; 00:00&#34;无论如何,我们只能MAX
反对0 :(要获得 时间,我们使用MOD(A1,1)
):
=-MAX(0, MOD(A1,1)-TIME(20,0,0))
最后,我们需要从最后一天修剪任何后期结束时间。我们将使用MIN
将此时的早期时间作为截止时间:
=+MIN(Mod(1+Time(5,0,0)-Time(20,0,0),1), MOD(B1-TIME(20,0,0),1))
将所有这些放入一个公式中,然后你去:
=(INT(B1-TIME(20,0,0))-INT(A1-TIME(20,0,0)))*MOD(1+TIME(5,0,0)-TIME(20,0,0),1)-MAX(0, MOD(A1,1)-TIME(20,0,0))+MIN(MOD(1+TIME(5,0,0)-TIME(20,0,0),1), MOD(B1-TIME(20,0,0),1))
{EDIT} 您可以将TIME(20,0,0)
和TIME(5,0,0)
更改为包含班次开始/结束时间的单元格引用。只要班次不超过24小时