这里有两个独立的问题,1) 帖子正文中的问题和 2) 帖子标题。
如果我想获取任务的原始 UID...
这个答案很简单:
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,它指的是子项目在主项目中的当前位置。
如果子项目从主项目中删除,它的“索引”不会被重新使用。同样,如果子项目在主项目中重新排列,“索引”值不会改变。因此,您不能使用子项目对象的 Index 属性来获取用于创建种子的内部“索引”值,因为该属性仅指示子项目的顺序。