You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在变更事件触发时计算指定任务的自定义字段值?

问题描述

能否编写脚本,在变更事件触发后仅对单个任务的字段执行计算?目前我有一个针对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重名,防止变量冲突

测试步骤

  1. 保存所有修改并重启MS Project
  2. 打开目标项目文件,事件会自动启动(通过Project_Open触发)
  3. 修改任意任务的分配信息,查看该任务的Cost5字段是否按预期更新

内容的提问来源于stack exchange,提问作者BP130

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:46:28