颜色摘要任务的宏是 90% 的工作,无法弄清楚为什么它不是 100% 的工作

Macro to color Summary Tasks is 90% working, cannot figure out why it is not 100% working

以下代码仅在所有摘要任务都完全展开时才有效。如果任何摘要任务被折叠,代码就会出错。

我什至不知道要尝试什么来解决这个问题。

 Sub ColorSummaryTasks()
 Dim t As Task
 Dim i As Integer

 i = 1
 For Each t In ActiveProject.Tasks

     If t.Summary Then

         SelectRow row:=i, rowrelative:=False

         Select Case t.OutlineLevel
             Case 1
             Font32Ex CellColor:=&H1099FF   'Hex code needs to be reversed
             Case 2
             Font32Ex CellColor:=&HFF9900
             Case 3
             Font32Ex CellColor:=&H66FF66
             Case 4
             Font32Ex CellColor:=&H10CC99
             Case 5
             Font32Ex CellColor:=&HDD3377
             Case 6
             Font32Ex CellColor:=&HFF00FF

         End Select

     End If

 i = i + 1
 Next t
 End Sub

无论摘要任务是否展开,代码都能正常工作的预期结果。发生的情况是,如果摘要任务下有 3 个折叠的行,它不会为接下来的 3 个未折叠的行着色,无论它们是否是摘要任务。 Imgur link 显示了当宏为 运行 并且摘要任务同时折叠和打开时会发生什么。 https://imgur.com/a/3stezhQ

问题源于代码以两种不同的方式循环执行任务。通过 task collection will go through every task whether visible or not. Using the SelectRow 方法循环仅适用于 可见任务.

同步这两种方法的最简单方法是从显示所有任务开始。将此代码放在循环之前*:

FilterApply "All Tasks"
SelectAll
OutlineShowAllTasks
SelectBeginning

* 请注意,这假定任务视图处于活动状态并且分组依据设置为 [无分组]。

或者,您可以 select 使用 Find 方法而不是使用 SelectRow 来完成所需的任务。仅供参考:这将跳过不可见的摘要任务。

Sub ColorSummaryTasks()
 Dim t As Task

 For Each t In ActiveProject.Tasks

     If t.Summary Then

         Find Field:="Unique ID", Test:="equals", Value:=t.UniqueID
         If ActiveCell.Task.UniqueID = t.UniqueID Then

             Select Case t.OutlineLevel
                 ' code here
             End Select

        End If

     End If

 Next t
 End Sub