有没有办法以编程方式获取子项目的种子值?

Is there a way to get a subproject's seed value programmatically?

我目前正在为 MS Project 编写 VBA 宏。我想遍历集成主文件(包含链接子项目的文件)中的所有任务并写入任务的原始唯一 ID 值。我知道插入的子项目得到一个“种子”值(4194304 的一些倍数)并且集成文件中所有任务的 UID 变成种子值 + 原始 UID 值

如果我想得到一个任务的原始UID,我怎么知道子项目的种子值是多少?我尝试使用任务所属项目对象的索引 属性,然后将其乘以 4194304,但索引 属性 似乎并不总是 return 正确的子项目索引值.

Sub test()

Dim t As Task
Dim subProjIndex As Integer
Dim originalUID As Long
Dim baseSeedVal As Long

baseSeedVal = 4194304

For Each t In Application.ActiveProject.Tasks
    subProjIndex = Application.Projects(t.Project).Index 'does not always give me the correct subproject index value
    originalUID = t.UniqueID - (baseSeedVal * subProjectIndex)
Next t

End Sub

这里有两个单独的问题,1) post 的 body 中的问题和 2) post.

的标题

如果我想获取任务的原始UID...

这个答案是straight-forward:

originalUID = t.UniqueID Mod 4194304

有没有办法以编程方式获取子项目的种子值?

有时需要找到子项目任务在主项目中的唯一 ID。这主要在处理外部链接时出现(例如任务的前导或后继在不同的项目中)。

此代码填充一个字典,其中包含每个子项目的名称和基本主 uid。给定本机任务 uid,这允许您通过主任务 uid 在主项目中查找任务。

Dim SubProjects As New Scripting.Dictionary

Const MasterUidSeed = 4194304

Function GetSubProjectInfo(ByVal prj As MSProject.Project) As Scripting.Dictionary

    ShowAllTasks

    Dim Subs As New Scripting.Dictionary
    Dim SubProj As Subproject
    
    For Each SubProj In ActiveProject.SubProjects

        Application.Find "Unique ID", "equals", SubProj.InsertedProjectSummary.UniqueID
        Application.SelectCellDown

        Dim UIDBase As Long
        UIDBase = (Application.ActiveCell.Task.UniqueID \ MasterUidSeed) * MasterUidSeed

        Subs.Add SubProj.SourceProject.Name, UIDBase

    Next

    Set GetSubProjectInfo = Subs

End Function

 Sub ShowAllTasks()

    ' expands all tasks to make sure all collapsed subprojects are loaded; presumes a task view is active
    With Application
        .SummaryTasksShow (True)
        .FilterClear
        .SelectAll
        .OutlineShowAllTasks
        .SelectBeginning
    End With

End Sub

请参阅此 SO post 了解如何在 VBA 中使用词典。

有关主项目任务 uid 如何工作以及为什么使用子项目索引会导致意外结果的更多信息:

主项目中的唯一 ID

将任务添加到项目时,会分配一个增量唯一 ID,从 1 开始。当项目合并到一个主项目中时,会通过添加种子值来更改唯一 ID,这样就不会出现重复项主项目。

种子值基于内部子项目“索引”。第一个子项目的任务的种子值为 4194304,第二个子项目的任务的种子值为 8388608 (4194304 * 2),依此类推。此“索引”与子项目的 Index property 不同,它指的是子项目在母版中的当前位置。

如果从主项目中删除了子项目,则其“索引”不是 re-used。同样,如果子项目在母版中重新排列,“索引”值也不会改变。因此,您不能使用子项目 object 的索引 属性 来获取用于创建种子的内部“索引”值,因为 属性 只是指示子项目的顺序。