如何为MS Project在VBA中为前任编写自己的过滤器



我当前正在设置一个Gaant图表,以确定一个巨大项目的运行时和依赖关系。

有600多个任务。他们彼此依赖,但不幸的是,并非以线性和聚类的方式。

我可以颜色一项任务的前辈和继任者。但是,由于两者之间还有其他任务,所以我需要滚动很多,才能到达下一个连接的任务。

我想在VBA中编写一个过滤器,以便仅向我展示所选任务的连接的前身和继任者。

到目前为止,我什至不知道如何编写一个简单的过滤器,因为在过滤器方面,在线文档非常差。

应用普通过滤器不起作用,因为它只会给我直接的前辈和继任者。

我希望前任的前身,依此类推。

我希望有人可以帮助我。

我在Google的帮助下找到了一个解决方案。这有点解决方法。

我的代码标志在项目字段中使用简单的"是"字段" Text10"(您可以使用任何其他文本字段(,然后使用"是"过滤所有任务。

Dim ProjTasks As Tasks
Dim ProjTasks2 As Task
Dim ProjTasks3 As Tasks
Dim ProjTask As Task
Dim ProjTask2 As Task
Dim ProjTask3 As Task
Dim Deadline As String
Set ProjTasks = ActiveProject.Tasks
Set ProjTasks2 = ActiveProject.Tasks
Set ProjTasks3 = ActiveProject.Tasks

所以我的代码的主要部分是:

 For Each ProjTask In ProjTasks
        If ProjTask.Start < (DateValue(Deadline) + TimeValue(Deadline)) Then
            For Each ProjTask2 In ProjTasks2
                If ProjTask2.Start < (DateValue(Deadline) + TimeValue(Deadline)) Then
                If Not (ProjTask2 Is Nothing) Then
                    If ProjTask2.Text10 = "YES" Then
                        PredArray() = Split(ProjTask2.Predecessors, ";")
                        For Each i In PredArray()
                            For Each ProjTask3 In ProjTasks3
                                If ProjTask3.Start < (DateValue(Deadline) + TimeValue(Deadline)) Then
                                If ProjTask3.ID = i Then
                                    ProjTask3.Text10 = "YES"
                                End If
                                End If
                            Next ProjTask3
                        Next i
                    End If
                End If
                End If
            Next ProjTask2
        End If
    Next ProjTask

因为它包含3个 for-loops,所以我试图最大程度地减少被循环的任务数量。

因为我可以看到目标任务何时结束(Deadline(,所以我不会绕过目标任务结束时间之后的任务。

请小心,该代码需要一些时间来运行。代码完成后,您可以转到" Text10"列,然后过滤"是"。

从MS Project 2013开始,有一个功能突出显示了主动任务的前辈和继任者(有关详细信息,请参见结束(。

但是,要隐藏未链接到特定任务的所有任务需要代码。幸运的是,前款和加工收集对象可以轻松完成此工作。

此代码找到链接到目标任务的所有任务(在这种情况下为活动任务(,并设置一个标志(text10 ='yes'(,以便可以将非连锁任务滤出。该代码仅触摸链接到目标任务的任务,并且每次仅触摸它们,因此它运行非常快。

可以轻松修改代码以使用不同的目标任务并添加标准,例如跳过完成的任务。

Sub FlagTasksLinkedtoTargetTask()
    Dim tsk As Task
    For Each tsk In ActiveProject.Tasks
        tsk.Text10 = vbNullString
    Next tsk
    Dim TargetTask As Task
    Set TargetTask = Application.ActiveCell.Task
    FlagPredecessors TargetTask
    FlagSuccessors TargetTask
End Sub
Sub FlagPredecessors(tsk As Task)
    Dim pred As Task
    For Each pred In tsk.PredecessorTasks
        If pred.Text10 <> "Yes" Then
            pred.Text10 = "Yes"
            FlagPredecessors pred
        End If
    Next pred
End Sub
Sub FlagSuccessors(tsk As Task)
    Dim succ As Task
    For Each succ In tsk.SuccessorTasks
        If succ.Text10 <> "Yes" Then
            succ.Text10 = "Yes"
            FlagSuccessors succ
        End If
    Next succ
End Sub

fyi:在"格式"选项卡上的任务路径下(查看gantt图表视图时(在任务路径下找到了突出显示功能。您可以选择以突出显示前任,驾驶前任(仅当前影响日期的人(,继任者和/或驱动的继任者。这是文档。

相关内容

  • 没有找到相关文章

最新更新