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

如何从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批量更新自定义字段,而非直接在公式中调用函数,步骤如下:

  1. 创建自定义字段:在MS Project中新建一个文本类型的自定义字段(例如命名为"Summary Status",可选择Text1-Text30中的任意一个)。
  2. 编写更新宏:编写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
    
  3. 触发更新:可以给宏设置快捷键,或者通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:48:13