Microsoft Project VBA 在任务更改时更新自定义字段

Posted

技术标签:

【中文标题】Microsoft Project VBA 在任务更改时更新自定义字段【英文标题】:Microsoft Project VBA to update Custom field on task change 【发布时间】:2021-12-22 18:56:50 【问题描述】:

我一直在绞尽脑汁,试图弄清楚如何编写一小段代码,该代码只有在修改了任务级别的特定字段时才会激活。

我尝试使用 for each 循环和选择案例使此代码在项目更改级别上工作,但这滞后于整个程序并且仍然没有给我所需的结果。我还尝试在使用 for each 循环和 select case 或一堆 If 语句手动运行时使其工作,但同样,它无法告诉我哪个字段已更改,但它可以突出显示两个字段之间的差异。

目标是有一个更改日志字段 (Text10),它会根据修改的字段和更改日期自动更新。我只关心 4 个字段的变化(Date1、Date2、Date3、Date4)。

例如如果 [Date1] 被修改,Text10 = "Date1 modified 10/11/21"

注意:如果修改了 2 个字段,我会很高兴只列出最后一个。

我希望有某种“On Change, If Target = xxx”,但我找不到类似的东西。

我还尝试实现此处定义的代码 >> Microsoft Documents: Project.Change Event 但我不清楚这应该做什么并且实际上看不到它在做什么/我从来没有得到我认为应该出现的消息框。

我正在使用 Microsoft Project Standard 2019。

【问题讨论】:

【参考方案1】:

经过大量研究和反复试验,我最终解决了这个问题。

为了让它工作,我添加了一个类模块并在打开时运行一段代码来初始化它。这实质上是告诉 Project 开始监视事件。然后,我使用“Field”变体在文本字符串中填充字段名称,并使用“NewVal”变体来填充结果。这最终是一个简单的解决方案。我发现有效的代码如下:

类模块“cm_Events”

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)

    'What you want the code to do
 
End Sub

在“m_Events”模块中

Public oMSPEvents As New cm_Events
Sub StartEvents()

    Set oMSPEvents.MyMSPApp = MSProject.Application
    
End Sub 

在本项目代码中

Private Sub Project_Open(ByVal pj As Project)

    Call m_Events.StartEvents 

End Sub

【讨论】:

这正是解决这个问题的方法。这是documentation。 但是,添加一个变量来跟踪代码本身何时对计划进行更改是一种很好的做法。在类模块中添加 Public EnableEvents As Boolean,在 Class_Initialize 中添加 EnableEvents = True 并用 If EnableEvents Then ... End If 包围 ProjectBeforeTaskChange 事件中的代码并设置 EnableEvents = False inside 块和在过程结束时将其设置回 True。

以上是关于Microsoft Project VBA 在任务更改时更新自定义字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 将文件添加到 MS-Project 任务注释字段

将 Microsoft Access 作为计划任务运行后退出

Microsoft Office Project 相关教程 收集

Microsoft Office Project是做啥的软件?

Microsoft Project教程_编程入门自学教程_菜鸟教程-免费教程分享

Project2019的新增功能和激活密钥