如何通过VB.NET+VSTO获取MS Project任务使用视图的周度计划工时数据?
Ms Project任务使用视图按周计划工时导出匹配问题解决方案
核心结论
要获取与WORK字段总和匹配的按周分布计划工时,需使用官方枚举中的pjTaskTimescaledWork(对应值为0);如果要匹配PLANNED WORK(基线计划工时),则使用pjTaskTimescaledBaselineWork(对应值为1,前提是已为任务设置基线)。
问题排查与修正步骤
移除自定义枚举,使用官方库枚举
你自定义的PjTaskTimescaledDataType枚举可能存在值偏差,直接引用Microsoft.Office.Interop.MSProject.PjTaskTimescaledDataType枚举,确保常量值与官方定义完全一致,避免因自定义值错误导致数据获取异常。确认时间范围与单位转换逻辑
获取时间刻度数据时,必须覆盖任务的完整生命周期(从任务Start到Finish),同时注意Project中工时默认单位为分钟,需除以60转换为小时。示例VB.NET代码如下:' 获取目标任务对象 Dim targetTask As MSProject.Task = project.Tasks.Item(1) ' 替换为你的任务获取逻辑 ' 获取按周分布的任务时间刻度工时数据 Dim tsWorkData As MSProject.TimescaledData = targetTask.TimescaledData( StartDate:=targetTask.Start, EndDate:=targetTask.Finish, Type:=MSProject.PjTaskTimescaledDataType.pjTaskTimescaledWork, TimeScaleUnit:=MSProject.PjTimescaleUnit.pjTimescaleWeek ) ' 计算时间刻度数据总和并转换为小时 Dim totalTsWork As Double = 0 For Each tsItem As MSProject.TimescaledDataItem In tsWorkData totalTsWork += tsItem.Value / 60 Next ' 对比任务WORK字段值(同样转换为小时) Dim taskTotalWork As Double = targetTask.Work / 60匹配PLANNED WORK的特殊处理
PLANNED WORK对应任务的基线计划工时,只有为任务设置过基线后,才能通过pjTaskTimescaledBaselineWork获取到对应时间刻度数据,其总和会与Baseline Work字段值一致(即初始计划工时)。
常见不匹配原因
- 时间范围未覆盖任务全周期,导致部分时段工时未被统计
- 单位转换错误(未将Project返回的分钟数转换为小时)
- 使用了错误的枚举类型(如误选实际工时、预算工时等类型)
- 任务存在拆分或非工作时间配置,需确认时间刻度数据是否按工作日统计(Project默认会排除非工作时间)
内容的提问来源于stack exchange,提问作者Jhorbam
相关产品推荐
相关产品推荐

