如何通过MS Project VBA获取指定日期/日期范围的任务分配工时?
在VBA中读取Project资源分配的指定日期范围工时
问题场景
创建了一个2024年3月11日开始、总工时16小时的任务,分配给名为DD的资源,需要读取该分配在特定日期或日期范围内的工时(即资源使用表中绿色标注的计划工时)。曾尝试使用TimeScaleData方法但误以为仅能写入,需获取正确的读取方法。
正确实现思路
TimeScaleData方法本身支持读取时间刻度数据,核心是正确配置参数并遍历返回的TimeScaleValues集合:
- 必须使用
Set关键字将返回的TimeScaleValues对象赋值给变量(因为是对象类型) - 指定正确的
Type参数:读取计划工时用pjAssignmentTimescaledWork,读取实际工时用pjAssignmentTimescaledActualWork - 设置
TimeScaleUnit为pjTimescaleDays以按天粒度获取数据 - 遍历
TimeScaleValues集合,每个元素的StartDate对应日期,Value对应该日期的工时(单位为分钟)
修正后的完整代码
Sub GetDDResourceWorkHours() Dim tsk As Task Dim asn As Assignment Dim tsv As TimeScaleValues Dim tsValue As TimeScaleValue ' 遍历所有任务 For Each tsk In ActiveProject.Tasks ' 跳过空任务(比如摘要任务下方的空行) If Not tsk Is Nothing Then ' 遍历任务的所有资源分配 For Each asn In tsk.Assignments ' 筛选资源名为DD的分配 If asn.Resource.Name = "DD" Then ' 获取2024年3月10日至3月20日的每日计划工时数据 Set tsv = asn.TimeScaleData( _ StartDate:=#3/10/2024#, _ EndDate:=#3/20/2024#, _ Type:=pjAssignmentTimescaledWork, _ TimeScaleUnit:=pjTimescaleDays _ ) ' 遍历时间刻度数据,输出日期和工时(转换为小时) For Each tsValue In tsv ' 仅输出有工时的日期 If tsValue.Value > 0 Then Debug.Print "日期: " & tsValue.StartDate & ",工时: " & tsValue.Value / 60 & "小时" End If Next tsValue End If Next asn End If Next tsk End Sub
关键注意事项
- 日期范围需覆盖任务实际执行时间:原代码中设置的3/1-3/7早于任务开始日期3/11,会返回空数据,需调整到包含任务周期的范围
- 工时单位转换:
Value属性返回的是分钟数,除以60可转换为小时 - 参数选择:如果需要读取实际已完成的工时,将
Type改为pjAssignmentTimescaledActualWork
内容的提问来源于stack exchange,提问作者Damien Dambre
相关产品推荐
相关产品推荐

