如何用VB.NET通过MS Project Interop编程设置月度资源任务分配
VB.NET通过MS Project Interop按月份分配资源值解决方案
你猜的没错,按月份设置资源分配值确实依赖MS Project Interop里的TimeScaleData机制,这是处理时间分段资源分配的核心方法。直接上实操步骤和代码:
核心思路
先完成任务与资源的基础分配(拿到ResourceAssignment对象),再通过TimeScaleData方法指定目标年月的时间范围,设置对应时间段的资源工作/单位值。
具体实现步骤
- 基础准备:确保已创建项目、任务、资源,并完成资源到任务的分配(获取
ResourceAssignment实例)。 - 确定目标时间范围:把指定年月转换成MS Project可识别的起始/结束日期(比如2024年5月对应
#5/1/2024#到#5/31/2024#)。 - 调用TimeScaleData设置值:通过
ResourceAssignment.TimeScaleData获取时间分段数据集合,定位到目标月份的分段后设置Value属性(比如工作时长、资源单位百分比)。
VB.NET代码示例
Imports Microsoft.Office.Interop.MSProject Imports System.Runtime.InteropServices Public Sub AssignResourceByMonth() ' 初始化MS Project应用 Dim projApp As New Application() projApp.Visible = True ' 可选,可视化调试 Dim newProj As Project = projApp.Projects.Add() ' 创建跨月测试任务 Dim testTask As Task = newProj.Tasks.Add("季度开发任务") testTask.Start = #4/1/2024# testTask.Duration = "3m" ' 持续3个月 ' 创建测试资源 Dim testResource As Resource = newProj.Resources.Add("前端开发工程师") ' 完成基础资源分配 Dim resourceAssign As ResourceAssignment = testTask.Assignments.Add(ResourceID:=testResource.ID) ' 设置2024年5月的资源工作值(80小时=4800分钟) Dim targetStartDate As Date = #5/1/2024# Dim targetEndDate As Date = #5/31/2024# ' 获取目标月份的时间刻度数据 Dim timeScaleData As TimeScaleDataCollection = resourceAssign.TimeScaleData( _ StartDate:=targetStartDate, _ EndDate:=targetEndDate, _ Type:=PjAssignmentTimescaledData.pjAssignmentTimescaledWork, _ TimeScaleUnit:=PjTimescaleUnit.pjTimescaleMonths, _ Count:=1 _ ) ' 赋值(工作值单位为分钟) If timeScaleData.Count > 0 Then timeScaleData(1).Value = 4800 End If ' 保存项目 newProj.SaveAs("C:\Temp\MonthResourceAssign.mpp") ' 清理COM资源,避免进程残留 Marshal.ReleaseComObject(timeScaleData) Marshal.ReleaseComObject(resourceAssign) Marshal.ReleaseComObject(testResource) Marshal.ReleaseComObject(testTask) Marshal.ReleaseComObject(newProj) projApp.Quit() Marshal.ReleaseComObject(projApp) End Sub
关键参数说明
PjAssignmentTimescaledData:指定数据类型,pjAssignmentTimescaledWork对应工作时长,pjAssignmentTimescaledUnits对应资源单位百分比(比如100表示全职)。PjTimescaleUnit:指定时间刻度单位,这里用pjTimescaleMonths匹配月份维度。Count:设置为1表示只获取目标月份的单个时间分段。
注意事项
- 日期范围必须精准对应目标年月的首尾,避免跨月导致数据设置偏差。
- 工作值的单位是分钟,小时转分钟需乘以60。
- 操作完成后必须手动释放所有COM对象,否则MS Project进程会在后台残留。
内容的提问来源于stack exchange,提问作者dk96m
相关产品推荐
相关产品推荐

