Vba 如何在子项目(主项目内)中选择任务的行
我有一个主项目,里面有几个子项目 我想根据字段Vba 如何在子项目(主项目内)中选择任务的行,vba,ms-project,Vba,Ms Project,我有一个主项目,里面有几个子项目 我想根据字段Text5的值格式化行的颜色 当前问题:如何使用VBA代码引用第二个子项目中的行。 当我运行代码并修改任务ID 5(在子项目2中)中的Text5值时,它会修改任务ID 5的颜色,但不会修改子项目1的颜色 如何使用SelectRow并向所需子项目添加参照 我的代码(相关章节) 子格式更改任务() 作为子项目的Dim子项目 调暗Tsk作为任务 我想我会坚持多久 对于ActiveProject.Subprojects中的每个子项目 '将子项目的名称与保存在
Text5
的值格式化行的颜色
当前问题:如何使用VBA代码引用第二个子项目中的行。
当我运行代码并修改任务ID 5(在子项目2中)中的Text5
值时,它会修改任务ID 5的颜色,但不会修改子项目1的颜色
如何使用SelectRow
并向所需子项目添加参照
我的代码(相关章节)
子格式更改任务()
作为子项目的Dim子项目
调暗Tsk作为任务
我想我会坚持多久
对于ActiveProject.Subprojects中的每个子项目
'将子项目的名称与保存在“堆栈”srray中的名称进行比较
如果SubPrj.SourceProject.Name=ModifiedPjName,则
对于SubPrj.SourceProject.Tasks中的每个Tsk
如果不是Tsk什么都不是
i=Tsk.ID
'检查Tsk.Text5值是否已从“StatusStackArr”数组中的值更改
如果StatusStackArr(i-1).StatusOldVal Tsk.Text5,则
'****在其下方的行中,从顶部选择行
(不是期望的子项目)******
选择行:=i,行相对:=False
“--格式化整行--
选择Case Tsk.Text5'获取字段的已用字段,而不是名称
案例“R”、“Y”、“G”
FontEx CellColor:=7,颜色:=0
FontEx斜体:=False'字体规则
案件“完成”
FontEx斜体:=真“字体斜体”
FontEx CellColor:=15,颜色:=14'背景银;字体灰色
结束选择
'代码的其余部分(不相关)
在主项目中设置行格式的挑战
要设置表格中文本的格式,请使用以下方法。此方法格式化活动(选定)单元格。要选择要格式化的行,请使用方法。要使用此方法,您需要知道:
SelectRow
方法的行参数。很难知道哪些任务可能被隐藏。使用此方法的最佳方法是首先确保所有任务都可见(请参见代码)
此外,在处理子项目时,计算绝对行位置是一项挑战,因为首先需要获得明细表中较高级别的子项目的任务计数以及主项目本身中的任何本机任务(尽管这是非典型的)
所有这些导致使用Find
方法,选项3,作为在主项目中选择任务的最佳方式。若要选择正确的任务,则必须将“查找方法”与唯一字段一起使用。唯一ID字段是唯一保证唯一的字段
主项目中的唯一ID
将任务添加到项目时,将分配一个增量唯一ID,从1开始。在主项目中合并项目时,通过添加种子值更改唯一ID,以便主项目中没有重复项
种子值基于内部子项目“索引”。第一个子项目的任务的种子值为4194304,第二个子项目的任务的种子值为8388608(4194304*2),依此类推
如果子项目从主项目中删除,则不会重复使用它的“索引”。类似地,如果子项目在主项目中重新排列,“索引”值不会更改。因此,您不能使用子项目对象的Index
属性来获取用于创建种子的内部“Index”值,因为该属性仅指示子项目的顺序。
(注意,有一种方法可以获取此内部值,但这超出了此问题的范围。仅供参考,它还需要选择所有任务。)
解决方案
要在用户界面中选择任务,您需要知道它在主计划中的唯一ID。如果通过SourceProject.Tasks
方法访问任务,则将访问其本机子项目中的任务,并且唯一ID将不包括种子值。例如,唯一ID为2,它在主项目中不唯一,因此不足以使用Find方法选择任务
由于您已经在计划中循环执行所有任务,因此确定主唯一ID的最简单方法是在主项目中本机循环执行任务。要执行此操作,请选择所有任务并循环选择
Sub FormatChangedTasks()
' show all tasks
FilterClear
SelectAll
SummaryTasksShow (0)
OutlineShowAllTasks
Dim AllTasks As Tasks
Set AllTasks = ActiveSelection.Tasks
Dim Tsk As Task
For Each Tsk In AllTasks
If Not Tsk Is Nothing Then
' compare the name of Sub-Project with the one saved in the "Stack" srray
If Tsk.Project = ModifiedPrjName Then
' check if Tsk.Text5 value has changed from prior value
' NOTE: use a dictionary here instead of an array
If StatusStackArr(i - 1).StatusOldVal <> Tsk.Text5 Then
Find "Unique ID", "equals", Tsk.UniqueID
SelectRow
' --format entire row --
Select Case Tsk.Text5 ' Get the Field's used field, not name
Case "R", "Y", "G"
FontEx CellColor:=7, Color:=0
FontEx Italic:=False ' Font regular
Case "Complete"
FontEx Italic:=True ' Font Italic
FontEx CellColor:=15, Color:=14 ' Background Silver ; font Gray
End Select
' rest of code (un-relevant)
End If
End If
Next Tsk
End Sub
子格式更改任务()
'显示所有任务
过滤器清理器
全选
SummaryTasksShow(0)
大纲显示所有任务
将所有任务设置为任务
设置AllTasks=ActiveSelection.Tasks
调暗Tsk作为任务
对于所有任务中的每个Tsk
如果不是Tsk什么都不是
'将子项目的名称与保存在“堆栈”srray中的名称进行比较
如果Tsk.Project=ModifiedPjName,则
'检查Tsk.Text5值是否已从先前的值更改
'注意:此处使用字典而不是数组
如果StatusStackArr(i-1).StatusOldVal Tsk.Text5,则
查找“唯一ID”、“等于”,Tsk.UniqueID
选择行
“--格式化整行--
选择Case Tsk.Text5'获取字段的已用字段,而不是名称
案例“R”、“Y”、“G”
FontEx CellColor:=7,颜色:=0
FontEx斜体:=False'字体规则
案件“完成”
Sub FormatChangedTasks()
' show all tasks
FilterClear
SelectAll
SummaryTasksShow (0)
OutlineShowAllTasks
Dim AllTasks As Tasks
Set AllTasks = ActiveSelection.Tasks
Dim Tsk As Task
For Each Tsk In AllTasks
If Not Tsk Is Nothing Then
' compare the name of Sub-Project with the one saved in the "Stack" srray
If Tsk.Project = ModifiedPrjName Then
' check if Tsk.Text5 value has changed from prior value
' NOTE: use a dictionary here instead of an array
If StatusStackArr(i - 1).StatusOldVal <> Tsk.Text5 Then
Find "Unique ID", "equals", Tsk.UniqueID
SelectRow
' --format entire row --
Select Case Tsk.Text5 ' Get the Field's used field, not name
Case "R", "Y", "G"
FontEx CellColor:=7, Color:=0
FontEx Italic:=False ' Font regular
Case "Complete"
FontEx Italic:=True ' Font Italic
FontEx CellColor:=15, Color:=14 ' Background Silver ; font Gray
End Select
' rest of code (un-relevant)
End If
End If
Next Tsk
End Sub