MS Project周度例外DaysOfWeek(pjWeekday)多组合整数值规则问询
MS Project 周度日历例外
DaysOfWeek字段计算逻辑 DaysOfWeek本质是位掩码枚举值,每一位对应一周中的某一天,选中多日时直接将对应日的数值相加即可得到最终值,无需录制所有选择场景。
数值对应规则
一周每天对应固定的2的幂次数值:
- 周日:对应值
1(2⁰) - 周一:对应值
2(2¹) - 周二:对应值
4(2²) - 周三:对应值
8(2³) - 周四:对应值
16(2⁴) - 周五:对应值
32(2⁵) - 周六:对应值
64(2⁶)
你给出的示例数值完全符合该规则:
- 示例值6 = 2+4,对应选中周一+周二
- 示例值10 = 2+8,对应选中周一+周三
- 示例值18 = 2+16,对应选中周一+周四
双向处理方法
正向生成(Excel导出到MS Project)
需要组合任意工作日时,只需把对应日期的数值相加,将总和赋值给DaysOfWeek参数即可。比如要选中每周的周一、周三、周五,对应总和为2+8+32=42,直接调用代码即可生效:
ActiveProject.BaseCalendars("Copy of Standard").Exceptions.Add _ Type:=6, _ Start:="2024/1/1", _ Finish:="2024/12/31", _ Name:="自定义周度规则", _ Period:=1, _ DaysOfWeek:=42
反向解析(MS Project导入到Excel)
如果需要把读取到的DaysOfWeek数值转换为对应的选中工作日列表,逐位做与运算判断即可,示例VBA解析代码:
Function GetSelectedDays(daysOfWeekVal As Integer) As String Dim dayNames, dayVals, i, res dayNames = Array("周日", "周一", "周二", "周三", "周四", "周五", "周六") dayVals = Array(1, 2, 4, 8, 16, 32, 64) res = "" For i = 0 To 6 If (daysOfWeekVal And dayVals(i)) = dayVals(i) Then res = res & IIf(res <> "", "、", "") & dayNames(i) End If Next GetSelectedDays = res End Function
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

