VBA在工作量为零时从MS Project中删除行

VBA在工作量为零时从MS Project中删除行,vba,ms-project,Vba,Ms Project,我有一份项目计划的主副本,其中包含作为项目一部分可能需要完成的所有可能任务。我想创建一个宏,一旦项目经理更新了项目计划,该宏将删除工时=0小时的任何行。我是为MS Project编写代码的新手,因此无法正确理解以下内容: Sub DeleteMsProjectTask() Dim proj As Project Dim w As Object Dim t As Task Set proj = ActiveProject For Each

我有一份项目计划的主副本,其中包含作为项目一部分可能需要完成的所有可能任务。我想创建一个宏,一旦项目经理更新了项目计划,该宏将删除工时=0小时的任何行。我是为MS Project编写代码的新手,因此无法正确理解以下内容:

Sub DeleteMsProjectTask()  
    Dim proj As Project  
    Dim w As Object  
    Dim t As Task  
    Set proj = ActiveProject  
    For Each t In proj  
       If w = 0 Then  
       Selection.EntireRow.Delete = True  
    End If  
    Next t  
    Loop  
End Sub

我不知道我做错了什么!提前感谢您的帮助。

已更新

不要遍历集合,而是按索引引用任务对象。这样可以避免在循环中修改集合时出现的问题(例如,通过删除成员)


谢谢你的意见。当我运行代码时,它只删除了一些零工作量的行。例如,我在计划下有一组任务,当我运行宏时,此部分下的任务将被删除。但是,当我为构建部分运行它时,它不会以零工作量完成所有任务。知道为什么会发生这种情况吗?各部分的设置方式没有什么不同-例如,按阶段>任务>子任务分组。1)如果第二次运行代码,它还会跳过这些任务吗?2) 这些任务是在主/子项目中,还是仅仅是一个项目?3) 找到要跳过的任务,选择该任务,然后转到VB编辑器并验证该工作是否为0。在即时窗口中键入以下内容:?ActiveCell.Task.Work1)当我第二次运行代码时,它只删除了几行。我连续多次尝试运行它,但仍保留了一些Work=0的任务。2) 这只是一个单独的项目。3) 我验证了工作量等于零。@AJ123,我在2000多行计划中测试了这一点。我最初的解决方案在较小的时间表上运行良好,但在较大的时间表上失败。新的解决方案现在应该适合您了。
Sub DeleteMsProjectTask()
    Dim proj As Project
    Set proj = ActiveProject
    Dim NumTasks As Integer
    NumTasks = proj.Tasks.Count
    Dim idx As Integer
    idx = NumTasks
    Dim t As Task
    Do While idx > 0
        Set t = proj.Tasks(idx)
        If t.Work = 0 Then
            t.Delete
            NumTasks = NumTasks - 1
        End If
        idx = idx - 1
    Loop
End Sub