我们的KPI之一是到达和离开之间的小时数,但是我们不工作的小时数不算对我们不利。我知道networkdays和networkdays.intl并最初在我们的一个文件中使用了它
IF(IF(INDIRECT("$D"&ROW())<>"",ROUNDDOWN(IF(INDIRECT("$D"&ROW())>INDIRECT("$A"&ROW()),0,(NETWORKDAYS(INDIRECT("$D"&ROW()),INDIRECT("$A"&ROW()),$W$2:$W$100)-NETWORKDAYS(INDIRECT("$D"&ROW()),INDIRECT("$D"&ROW()),$W$2:$W$100)*MOD(INDIRECT("$D"&ROW()),1)-NETWORKDAYS(INDIRECT("$A"&ROW()),INDIRECT("$A"&ROW()),$W$2:$W$100)*(1-MOD(INDIRECT("$A"&ROW()),1)))*24),0),"")>24,"X","")
其中$ A是开始时间,$ D是结束时间,W2-W100是假期。
但是,这是行不通的,因为影响我们的“开放时间”是星期一上午6点至星期五晚上11点以及星期六上午7点至下午2点,但是我们的记录也涵盖了星期五晚上11点至星期六晚上7点,应该显示为零,以及潜在的星期六下午2点至10点。我们也有假期,但是在那些假期中,第三班倒是在当天的早上6点结束,而第一班的倒班是在第二天的早上6点开始,因此使用网络日时,有些数字会搞砸。
几个月来我一直在尝试以解决这个问题,但没有任何效果。
最初,我们有一个访问数据库,该数据库的运行方式很简单,如果week(start)> week(end)然后time = end-start-2。显然,这不符合我们的KPI要求。
我也尝试过
Function customTime(startTime As Date, endTime As Date, holidays As Range) As Date
Dim returnTime
returnTime = endTime - startTime - (2 * (Application.WeekNum(endTime, 2) - Application.WeekNum(startTime, 2)))
If Application.Weekday(startTime, 2) = 6 Then returnTime = returnTime + startTime - Application.RoundDown(startTime, 0)
If Application.Weekday(startTime, 2) = 7 Then returnTime = returnTime + startTime - Application.RoundDown(startTime, 0) + 1
For Each hols In holidays
If startTime < hols And endTime > hols + 1 Then returnTime = returnTime - 1
Next hols
CustomTime = returnTime
End Function
与网络日基本相同,但负责周末工作(我认为)。我最终确实不得不修复了新的一年错误。
returnTime = endTime - startTime - (2 * ((Year(endTime) * 52) + Application.WeekNum(endTime, 2) - (Year(startTime) * 52) - Application.WeekNum(startTime, 2)))
这已经足够了一段时间,但现在我们希望获得有关这些数据的更准确的数据,并希望排除我们所有的确切时间。我已将其更改为在两列中使用打开和关闭时间戳记,并且在调整程序以实际在此处进行数学计算的过程中,我搞砸了语法(我认为)并导致其出错并偶尔崩溃excel完全。
Function CTime2(startTime As Date, endTime As Date, hoursrange As Range) As Date
Dim returnTime
returnTime = endTime - startTime
Dim hours As Variant
hours = hoursrange.Value
For i = LBound(hours, 1) + 1 To UBound(hours, 1)
If startTime < hours(i, 1) And endTime < hours(i, 1) Then
Exit For
ElseIf startTime > hours(i, 2) And endTime > hours(i, 2) Then
Next i
ElseIf startTime > hours(i, 1) And endTime < hours(i, 2) Then
Exit For
ElseIf startTime < hours(i - 1, 2) And endTime > hours(i, 1) Then
returnTime = returnTime - (hours(i, 1) - hours(i - 1, 1))
End If
Next i
CTime2 = returnTime
End Function
之所以失败,是因为它找不到退出或下一个的for循环,找不到else的if循环,而同时又找不到for循环(当我将其用作continue时) )。我对vba知之甚少,无法弄清楚我在做什么,或者即使我在正确的道路上。