Microsoft Project VBA 将在任务更改时更新自定义字段
Microsoft Project VBA to update Custom field on task change
我一直在绞尽脑汁想弄清楚如何编写一小段代码,只有在任务级别的特定字段被修改时才会激活。
我试图通过 for each 循环和 select 案例使此代码在项目更改级别工作,但这滞后于整个程序并且仍然没有给我我需要的结果。我还尝试在 运行 手动使用 for each 循环和 select 案例或一堆 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。
经过大量研究和反复试验,我最终解决了这个问题。
为了让它工作,我添加了一个 Class 模块和 运行 一段打开的代码来初始化它。这实质上告诉 Project 开始监视事件。然后,我使用“Field”变体在文本字符串中填充字段名称,并使用“NewVal”变体填充结果。这最终是一个简单的解决方案。我发现有效的代码如下:
在Class模块“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
我一直在绞尽脑汁想弄清楚如何编写一小段代码,只有在任务级别的特定字段被修改时才会激活。
我试图通过 for each 循环和 select 案例使此代码在项目更改级别工作,但这滞后于整个程序并且仍然没有给我我需要的结果。我还尝试在 运行 手动使用 for each 循环和 select 案例或一堆 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。
经过大量研究和反复试验,我最终解决了这个问题。
为了让它工作,我添加了一个 Class 模块和 运行 一段打开的代码来初始化它。这实质上告诉 Project 开始监视事件。然后,我使用“Field”变体在文本字符串中填充字段名称,并使用“NewVal”变体填充结果。这最终是一个简单的解决方案。我发现有效的代码如下:
在Class模块“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