【问题标题】:Conducting Calculation on Selected Task's Custom Field Upon Change Event对选定任务自定义字段进行计算更改事件
【发布时间】:2023-01-30 23:40:56
【问题描述】:

我想知道是否可以创建一个脚本,在发生更改事件后为选定任务的字段运行计算。我目前有一个脚本可以为我的 ms 项目文件中的每个任务运行计算。我想通过实现隔离任务并计算相应值的代码来摆脱这种方法。

有人可以让我知道这是否可能吗?

我目前没有代码块,因为我一直在努力从哪里开始。我已经引用了这个线程 (Microsoft Project VBA to update Custom field on task change),但未能成功实施。

我的 cm_Events 类模块:

公共 WithEvents MyMSPApp 作为 MSProject.Application

私有子类_Initialize()

Set MyMSPApp = Application

结束子

我的 m_Events 模块:

公共 oMSPEvents 作为新的 cm_Events 公共 EnableEvents 作为布尔值

子 StartEvents()

Set oMSPEvents.MyMSPApp = Application ' MSProject.Application
EnableEvents = True

结束子

我的项目代码块:

私有子项目_打开(ByVal pj 作为项目)

Call m_Events.StartEvents

结束子

【问题讨论】:

  • 明确地说,您需要某种方法来仅在对该任务的字段进行更改时才对该任务执行某种计算吗?
  • 我确定可以修改您的代码以执行一项孤立的任务……但我建议您实际发布您拥有的代码,如果您希望有人查看它的话。
  • @KennyArnold,你的理解是正确的。
  • @CameronCritchlow,我现在将上传我的代码。我想在两个脚本中应用这种方法。我会先上传不太复杂的脚本。
  • @BP130 你是想让它只适用于一个特定的项目,还是对你从事的所有项目都通用?

标签: vba ms-project


【解决方案1】:

为了厘米_事件 班级模块:

Public WithEvents MyMSPApp As MSProject.Application

Private Sub Class_Initialize()

    Set MyMSPApp = Application

End Sub

Private Sub MyMSPApp_ProjectBeforeTaskChange(ByVal tsk As Task, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean)

    Debug.Print Now, FieldConstantToFieldName(Field), NewVal

    If EnableEvents Then
        EnableEvents = False
        
        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
        
        EnableEvents = True
    End If
    
End Sub

为了m_Events模块:

Public oMSPEvents As New cm_Events
Public EnableEvents As Boolean

Sub StartEvents()

    Set oMSPEvents.MyMSPApp = Application ' MSProject.Application
    EnableEvents = True
    
End Sub

为了这个项目模块:

Private Sub Project_Open(ByVal pj As Project)

    Call m_Events.StartEvents

End Sub

尖端:

  • 确保厘米_事件是类模块而不是常规模块。
  • 任何时候您对代码进行更改时,事件都将停止运行——始终运行启动事件进行任何更改后的程序。
  • 从 ProjectBeforeTaskChange 事件中的简单代码开始,如调试语句以验证事件是否被触发。
  • 任务变更事件就是这样——由任务的变化触发,而不是资源或分配的变化。

【讨论】:

  • 您是否愿意简要解释一下这些代码块如何协同工作以计算并在 Cost5 中赋值?另外,您愿意提供一些步骤来执行示例吗?这是我第一次实现这样的代码,我想我以某种方式搞砸了。
  • @BP130 我在事件过程中添加了一些提示和示例调试语句。
  • 这对我的理解非常有帮助-谢谢!如果我计划进行的主要更改是资源分配怎么办?可以很容易地用 assignmentchange 替换 taskchange 吗?从本质上讲,我试图将人工成本拉入一个单独的列(即 Cost5),而不必运行我的长脚本来遍历每个任务的每个分配。我可能会将资源 1 单位从 2 更改为 3,并希望看到成本漏斗上升到成本 5。
  • 我用 assignemnt change 替换了 taskchange 并将输入更新为分配数据类型。我收到编译错误。它指出,“过程声明与具有相同名称的事件或过程的描述不匹配”。
猜你喜欢
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多