跳过代码部分(VBA)

时间:2016-04-25 16:13:59

标签: vba ms-project

我在MS Project中开发了一个自定义应用程序。当它正在执行其中一个功能时,它会跳过一部分代码,导致输出错误。下面是导致错误并强制应用程序向前跳过的代码行。任何人都知道可能导致它的原因吗?

FilterEdit Name:="fCriteria", TaskFilter:=True, Create:=True, _
    OverwriteExisting:=True, FieldName:="Flag20", test:="equals", _
    Value:="No", ShowInMenu:=False, ShowSummaryTasks:=True 

这是整个子例程

If keepCriteriaCount > 0 And globRemProducts = True Then
    Application.ScreenUpdating = False
     WindowActivate WindowName:=globNewWindow
     TableApply Name:="Master Template"
 FilterApply Name:="All Tasks"
 Application.SetAutoFilter FieldName:="Flag20", FilterType:=pjAutoFilterClear

   SelectSheet
    SetTaskField Field:="Flag20", Value:="No"
    SelectTaskField Row:=0, Column:="Flag20", Height:=0
    EditCopy
    SelectTaskColumn Column:="Flag20"
    FillDown

            keepCriteriaArray() = Split(keepCriteria, ",")
            fCount = 0

            'Remove Tasks for excluded Products

                    For dCriteria = LBound(keepCriteriaArray) To UBound(keepCriteriaArray)
                        If Not keepCriteriaArray(dCriteria) = "" Then
                            If Len(Trim(keepCriteriaArray(dCriteria))) = 2 Then
                                projChannels = Trim(keepCriteriaArray(dCriteria)) & ","
                            Else
                                projChannels = Trim(keepCriteriaArray(dCriteria))
                            End If
                            If fCount = 0 Then
                                FilterEdit Name:="fCriteria", TaskFilter:=True, Create:=True, OverwriteExisting:=True, FieldName:="Text24", test:="contains", Value:=projChannels, ShowInMenu:=False, ShowSummaryTasks:=False
                                FilterEdit Name:="fCriteria", TaskFilter:=True, FieldName:="", NewFieldName:="Text24", test:="contains", Value:="All", Operation:="OR", ShowSummaryTasks:=False
                                fCount = fCount + 1
                            Else
                                projChannels = Trim(keepCriteriaArray(dCriteria))
                                FilterEdit Name:="fCriteria", TaskFilter:=True, FieldName:="", NewFieldName:="Text24", test:="contains", Value:=projChannels, Operation:="OR", ShowSummaryTasks:=False
                            End If
                        End If


                    Next dCriteria

            FilterApply Name:="fCriteria" ' apply the filter
            SelectSheet
            tCount = ActiveSelection.Tasks.Count
                SelectSheet
                SetTaskField Field:="Flag20", Value:="Yes"
                SelectTaskField Row:=0, Column:="Flag20", Height:=0
                EditCopy
                SelectTaskColumn Column:="Flag20"
                FillDown
             FilterApply Name:="All Tasks"
             Application.SetAutoFilter FieldName:="Flag20", FilterType:=pjAutoFilterClear
              If addCriteriaCount = 0 Then
                    tCriteria = projChannels & "; " & globStoreChannels & "; " & txtCustType.Value
                Else
                    tCriteria = addCriteria & ", " & projChannels & "; " & globStoreChannels & "; " & txtCustType.Value
                End If
    'WindowActivate WindowName:=globNewWindow


    TableApply Name:="Master Template"
    tskHeaderRow = 1


    SelectTaskField Row:=tskHeaderRow, Column:="Text4"
    SetTaskField Field:="Text4", Value:=tCriteria

             'before you delete - outdent all tasks
             SelectSheet

            For rLevel = ActiveSelection.Tasks.Count To 1 Step -1

                    SelectTaskField Row:=rLevel, Column:="Name", RowRelative:=False
                    OutlineOutdent
                    OutlineOutdent
                    OutlineOutdent
                    OutlineOutdent
            Next rLevel

                'If Not ActiveProject.AutoFilter Then Application.AutoFilter
                'Group
                On Error Resume Next
                'Application.SetAutoFilter FieldName:="Flag20", FilterType:=pjAutoFilterCustom, Test1:="contains", Criteria1:="No"
                FilterEdit Name:="fCriteria", TaskFilter:=True, Create:=True, OverwriteExisting:=True, FieldName:="Flag20", test:="equals", Value:="No", ShowInMenu:=False, ShowSummaryTasks:=True
                FilterApply Name:="fCriteria" ' apply the filter
                SelectSheet
                On Error GoTo removeErr
                If ActiveSelection.Tasks.Count >= 1 Then

                    SelectSheet
                        EditDelete

                End If

1 个答案:

答案 0 :(得分:0)

这并不像你希望的那样有用......对不起......

原因是"跳过"是因为你正在进行错误处理的方式。 On Error Resume Next正在屏蔽所有相关信息。现在,您可以通过在攻击行之后直接添加Debug.Print err.number: Debug.Print err.description之类的内容,让您的程序在此处为您提供更多信息,但这只会将您的错误放入日志中。它只会帮助你使用一行,即使你的错误忽略部分中有多行代码。如果你一直在看你的日志,所有这一切都很好,但是当我使用Project时,我很少有时间搞乱它。我认为你是一样的。

现在,如果我不得不猜测问题(我当前的机器上没有安装Project,我目前的合同都没有让我使用Gannt图表。我知道,你应该同情我),我想我记得Create:=True, OverwriteExisting:=True是多余的,您可以删除覆盖部分,以防即使在应用了所有任务后仍然使用fCriteria。或者,也许不是编辑和覆盖相同的过滤器,而是创建fCriteria1,fCriteria2等。您仍然可以像过去一样复制过滤器,并且在清理代码期间可以.delete过滤器,所以没有残留的混乱。

我不知道这些选项中的任何一个是否有用,但是在尝试调试时它们会帮助我。

相关问题