使用 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
是否可以使用 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