2016-04-25 359 views
0

我有一个为MS Project开发的自定义应用程序。当它执行其中一个函数时,它会跳过一部分代码,导致输出不正确。以下是导致错误并强制应用程序跳过的代码行。任何人都知道可能是什么造成的?部分代码(VBA)被跳过

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 
+0

我不熟悉MS Project,但我有很多编码经验。通常,对于类似“跳过”的内容,查看更多上下文(更多代码)很重要。您可以使用问题下方的[编辑]链接添加更多代码。 –

+0

当你说跳过,这是否意味着你有一些错误陷阱说这是方式或它调试,你移动它? –

+0

有一行代码写入,如果发生错误,它会将其发送到下一个例程 – BLUMan

回答

0

这不会是因为你希望...对不起乐于助人......

将它存在的理由“跳过结束“是因为你正在做错误处理的方式。 On Error Resume Next掩盖了所有相关信息。现在,你可以让你的程序在这里给你更多的信息,通过在进攻线后面加上Debug.Print err.number: Debug.Print err.description之类的东西,但是这只会把你的错误写入日志。即使你在'错误忽略部分'中有多行,它也只能帮你一行。如果你随时都在看你的日志,所有这一切都很好,但是当我使用Project时,我很少有时间惹恼它。我假设你是一样的。现在,如果我必须猜测这个问题(没有在当前机器上安装Project,我的当前合同中没有一个需要我使用Gannt图表,我知道,你应该可怜我),我想我记得Create:=True, OverwriteExisting:=True是多余的,并且即使在应用了所有任务之后仍然正在使用fCriteria的情况下,您可以移除覆盖部分。或者,也许不是编辑和覆盖相同的过滤器,而是使fCriteria1,fCriteria2等。您仍然可以像过去一样复制过滤器,并且可以在清理代码的过程中在末尾使用.delete过滤器,因此不会出现混乱。

我不知道这些选项是否有帮助,但它们在尝试调试时帮助我。