Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在子项目(主项目内)中选择任务的行_Vba_Ms Project - Fatal编程技术网

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'背景银;字体灰色
结束选择
'代码的其余部分(不相关)
在主项目中设置行格式的挑战 要设置表格中文本的格式,请使用以下方法。此方法格式化活动(选定)单元格。要选择要格式化的行,请使用方法。要使用此方法,您需要知道:

  • 其相对于活动选择的位置,或
  • 其在可见任务中的绝对位置,或
  • 根据唯一标识符查找任务
  • 对于选项1和选项2,过滤器或折叠摘要隐藏的任务意味着必须相应调整
    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