如何在变更事件触发时计算指定任务的自定义字段值?
问题描述
能否编写脚本,在变更事件触发后仅对单个任务的字段执行计算?目前我有一个针对MS Project文件中所有任务计算的脚本,希望改成只处理目标任务。
我尝试相关内容但未成功实现,现有代码如下:
类模块 cm_Events
Public WithEvents MyMSPApp As MSProject.Application Private Sub Class_Initialize() Set MyMSPApp = Application End Sub Private Sub MyMSPApp_ProjectBeforeAssignmentChange(ByVal Assgn As Assignment, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean) If EnableEvents Then EnableEvents = False Dim X As Integer X = 5 Debug.Print X EnableEvents = True End If End Sub
标准模块 m_Events
Public oMSPEvents As New cm_Events Public EnableEvents As Boolean Sub StartEvents() Set oMSPEvents.MyMSPApp = Application EnableEvents = True End Sub
Project对象代码
Private Sub Project_Open(ByVal pj As Project) Call m_Events.StartEvents End Sub
我希望将以下计算逻辑加入ProjectBeforeAssignmentChange事件中:
tsk.Cost5 = 0 Dim Assgn As Assignment For Each Assgn In tsk.Assignments If Assgn.Resource.Text1 = "Labor" Then tsk.Cost5 = tsk.Cost5 + Assgn.Cost Assgn.Cost5 = Assgn.Cost5 + Assgn.Cost End If Next Assgn
解决方案
完全可行,只需将计算逻辑与事件触发时的关联任务绑定即可,关键是通过Assgn.Task获取当前变更对应的任务,同时避免事件循环。修改后的代码如下:
修改后的类模块 cm_Events
Public WithEvents MyMSPApp As MSProject.Application Private Sub Class_Initialize() Set MyMSPApp = Application End Sub Private Sub MyMSPApp_ProjectBeforeAssignmentChange(ByVal Assgn As Assignment, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean) If EnableEvents Then EnableEvents = False ' 获取当前变更关联的任务 Dim tsk As Task Set tsk = Assgn.Task ' 执行目标计算逻辑 tsk.Cost5 = 0 Dim currAssgn As Assignment For Each currAssgn In tsk.Assignments If currAssgn.Resource.Text1 = "Labor" Then tsk.Cost5 = tsk.Cost5 + currAssgn.Cost currAssgn.Cost5 = currAssgn.Cost5 + currAssgn.Cost End If Next currAssgn EnableEvents = True End If End Sub
关键说明
- 通过
Assgn.Task直接获取变更操作对应的任务,无需遍历所有任务,实现单任务精准计算 - 保留
EnableEvents开关,避免修改字段时再次触发事件导致循环 - 将循环变量名改为
currAssgn,避免与事件参数的Assgn重名,防止变量冲突
测试步骤
- 保存所有修改并重启MS Project
- 打开目标项目文件,事件会自动启动(通过
Project_Open触发) - 修改任意任务的分配信息,查看该任务的
Cost5字段是否按预期更新
内容的提问来源于stack exchange,提问作者BP130
相关产品推荐
相关产品推荐

