使用 VBA 的 MS Project 中两个日期之间可能的工作时间

The amount of possible working hours between two dates in MS Project using VBA

是否可以使用 VBA return MS Project 中开始时间和结束时间之间的可能工作时间?例如,如果开始时间和结束时间是同一天的中午 12 点到下午 5 点,并且从 12:30p 到 1:30pm 有午休时间,那么值 returned 将是 4 小时(而不是5 小时的总时间)。

编辑:您还可以使用 VBA 计算一天中轮班(休息)的总数吗?

问题 #1:计算两个日期之间的工作时间

Microsoft Project 应用程序对象有一个名为 DateDifference 的方法,它就是这样做的——它计算两个日期之间的工作时间,您可以选择提供一个日历对象(默认使用项目日历) . return 值以分钟为单位,因此除以 60 得到小时数。

使用中级 Window* 测试:

? Application.DateDifference (#3/11/19 12:00 PM#, #3/11/19 5:00 PM#) / 60
 4 
? Application.DateDifference (#3/11/19 12:00 PM#, #3/11/19 5:00 PM#, ActiveProject.BaseCalendars("24 Hours")) / 60
5

注意:可选的 Calendar 参数是日历 object,而不是日历的名称,它必须是活动项目正在使用的日历。

* 在 VB 编辑器中,按 Ctrl+G 调出 Intermediate Window.

问题 #2:计算给定日期的轮班次数

此函数将 return 特定日历的给定日期的班次数。如果未提供日历名称,则使用项目日历。

它的工作原理是利用布尔值可以转换为整数(False = 0,True = -1)这一事实来计算 true 表达式的数量。具体来说,如果使用班次,则开始时间 returned 作为字符串表示(例如“8:00 AM”),但如果不使用班次,则 returned 作为整数 (0).

Function ShiftCount(d As Date, Optional calendarName As Variant)

    Dim c As Calendar
    If IsMissing(calendarName) Then
        Set c = ActiveProject.Calendar
    Else
        Set c = ActiveProject.BaseCalendars(calendarName)
    End If

    Dim NumShifts As Integer
    With c.Period(d)
        NumShifts = -CInt(VarType(.Shift1.Start) = vbString) _
                   - CInt(VarType(.Shift2.Start) = vbString) _
                   - CInt(VarType(.Shift3.Start) = vbString) _
                   - CInt(VarType(.Shift4.Start) = vbString) _
                   - CInt(VarType(.Shift5.Start) = vbString)
    End With

    ShiftCount = NumShifts

End Function