两个日期之间的小时,基于VBA / Excel中的开放时间

时间:2019-01-18 14:11:34

标签: excel vba

我们的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知之甚少,无法弄清楚我在做什么,或者即使我在正确的道路上。

0 个答案:

没有答案