如何从MS Project自定义字段调用VBA公共函数?
问题描述
我编写了一个VBA公共函数SummaryStatus并保存到Global.MPT中,该函数在VBA立即窗口可正常运行,但在MS Project自定义字段的可选函数列表中找不到它,手动输入SummarryStatus([Unique ID])时会触发语法错误。Global.MPT中的其他宏和子程序都能正常执行,我想了解如何在MS Project自定义字段公式中调用任意VBA函数。
函数代码如下:
Public Function SummaryStatus(nT As Long) As String Dim c As Task Dim cT As Task, ipT As Task For Each c In ActiveProject.Tasks(nT).OutlineChildren If c.PercentComplete = 100 Then Set cT = c ElseIf c.PercentComplete <> 0 Then Set ipT = c End If Next c If Not cT Is Nothing Then SummaryStatus = cT.Name & " Completed" ElseIf Not ipT Is Nothing Then SummaryStatus = ipT.Name & " In Progress" Else SummaryStatus = "Not Started" End If End Function
解决方案
核心限制说明
MS Project的自定义字段公式仅支持调用软件内置函数,无法直接调用用户自行编写的VBA函数,这是软件的原生设计限制,与函数是否存储在Global.MPT无关。
替代实现方法
要实现你需要的功能,需通过VBA批量更新自定义字段,而非直接在公式中调用函数,步骤如下:
- 创建自定义字段:在MS Project中新建一个文本类型的自定义字段(例如命名为"Summary Status",可选择
Text1-Text30中的任意一个)。 - 编写更新宏:编写VBA宏遍历目标任务,调用
SummaryStatus函数并将结果赋值给自定义字段:Sub UpdateSummaryStatusField() Dim t As Task For Each t In ActiveProject.Tasks ' 仅针对摘要任务更新,可根据需求调整判断条件 If Not t Is Nothing And t.Summary Then ' 这里假设使用Text1作为自定义字段,需与实际创建的字段对应 t.Text1 = SummaryStatus(t.UniqueID) End If Next t End Sub - 触发更新:可以给宏设置快捷键,或者通过Project事件(如任务进度变化时)自动触发更新,确保字段内容与任务状态同步。
进阶:自动同步设置
若需要字段内容随任务状态自动更新,可在Global.MPT中添加Project_Change事件处理逻辑(需注意避免无限循环):
Private Sub Project_Change(ByVal pj As Project) ' 仅当任务进度变化时触发更新 If ActiveSelection.Tasks.Count > 0 Then UpdateSummaryStatusField End If End Sub
内容的提问来源于stack exchange,提问作者Daniel Labelle
相关产品推荐
相关产品推荐

