【问题标题】:Excel VBA error when calling MS Project Task's Unique ID调用 MS 项目任务的唯一 ID 时出现 Excel VBA 错误
【发布时间】:2019-07-18 19:33:36
【问题描述】:

在 Excel 工作表中,我正在使用 VBA 遍历 MS Project 文件中的任务。

我发现我的代码运行良好,直到我遇到一个没有名称但错误让我感到困惑的 MS Project 任务。当我删除这些未命名的任务时,错误就消失了。

我尝试添加一个 if 语句:If prj.Tasks(i).UniqueID Is Nothing Then 来捕获此错误,但我收到了一个 Type mismatch 错误。

Dim i As Integer
Dim TaskID As Long
Dim ExcelRow As Integer
For i = 1 To prj.Tasks.Count
    TaskID = prj.Tasks(i).UniqueID  'This line is highlighted when I debug
    ExcelRow = GetRowByUniqueID(TaskID)
    Debug.Print ExcelRow

我的错误是未设置对象变量(错误 91)。我对此感到困惑,因为我的印象是所有任务都有一个唯一的 ID。当我在 Microsoft Project 中打开 .mpp 文件时,我可以看到任务没有名称,但在唯一 ID 列中具有唯一 ID。

编辑:我刚刚意识到这不是prj.Tasks(i).UniqueID 的问题,而是prj.Tasks(i) 的问题。 i在Task数量范围内,怎么可能不设置这个变量?

【问题讨论】:

    标签: excel vba ms-project


    【解决方案1】:

    好的,我刚刚想通了。 不知何故,当我遍历所有任务时,其中一些是Nothing。我真的不明白为什么,但至少,我能够用 if 语句来理解这一点:

    If prj.Tasks(i) Is Nothing Then
        Debug.Print "This is nothing."
    
    Else
        TaskID = prj.Tasks(i).UniqueID
        ExcelRow = GetRowByUniqueID(TaskID)
        Debug.Print ExcelRow
    

    现在,我的代码完全没有中断。

    【讨论】:

    • 既然Tasks 是一个对象集合,那么声明一个本地的currentTask 变量然后使用For Each currentTask In prj.Tasks 进行迭代会起作用吗? (无论如何它可能会更有效,因为对象集合想要使用For Each 进行迭代).. Tasks 包含Nothing 项目非常奇怪。
    • @MathieuGuindon 感谢您的建议。我对此进行了测试,并且遇到了与以前相同的错误。在我再次添加 if 语句后,代码不再中断。因此,即使使用For Each currentTask in prj.Tasks,一些currentTasks 仍然没有...
    • 有趣。看起来项目 API 有点坏了——我一点也不熟悉,但这绝对是令人惊讶的行为。事实上,空检查似乎是你唯一的希望。
    • @vivianyoung 测试是在循环任务时处理此问题的标准方法。正如@MathieuGuindon 提到的,使用for...each 循环也可以工作,而且通常更可取,因为不必先知道有多少任务(而且看起来更干净)。
    猜你喜欢
    • 2015-03-20
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多