循环内的错误处理,用于数据透视表对象排序

时间:2016-10-19 07:19:53

标签: vba excel-vba error-handling excel

我一直在尝试使用我尝试过的函数对VBA中的数据透视表对象进行排序:

Public Function PTSort(PTName As String, PTFieldName as String, SortArray As Variant)

Dim m as Integer: m = 1 'Row counter
Dim i as Long 'Dummy Variable for cycling

With ActiveSheet.PivotTables(PTName).PivotFields(PTFieldName)
    .Parent.ManualUpdate = True
    For i = LBound(SortArray) To UBound(SortArray)
        With .PivotItems(SortArray(m - 1)) 'For in-code array
            .Position = m
        End With
    m = m + 1
    Next i
    .Parent.ManualUpdate = False
End With

End Function

虽然这适用于 SortArray 中的一组已知元素,但我在排序时需要遵循一个主列表(以便在几个数据透视表中标准化几个订单),其中数据透视表需要不一定包含所有说的PivotItems。因此,我将其改进为以下内容:

Sub PTSort(PTName As String, PTFieldName as String, SortArray As Variant)

Dim m as Integer: m = 1
Dim i as Long
Dim k As Integer: k = 1 'To cycle the position independently from the array in the event of disjoint.

With ActiveSheet.PivotTables(PTName).PivotFields(PTFieldName)
    .Parent.ManualUpdate = True
    For i = LBound(SortArray) To UBound(SortArray)
        On Error GoTo ERRHANDLER:
        With .PivotItems(SortArray(k)) 'After parsing from range of cells into VariantArray, then does one not require the "-1"
            .Position = m
        End With
    m = m + 1
ExitHandler:
    k = k + 1
    Next i
    .Parent.ManualUpdate = False
End With
GoTo ENDEND:

ERRHANDLER:
GoTo EXITHANDLER:

ENDEND:
End Sub

OnError GoTo 似乎只能工作一次,无论它放在多高位置?

非常感谢帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这是来自Visual Studio上的MSDN,但我认为它以同样的方式适用于VBA。

  

“启用”错误处理程序是由On Error语句打开的错误处理程序。 “活动”错误处理程序是处理错误的已启用处理程序。

     

如果错误处理程序处于活动状态时发生错误(在错误发生与Resume,Exit Sub,Exit Function或Exit Property语句之间),则当前过程的错误处理程序无法处理错误。控制权返回调用程序

因此,在您的代码首次访问On Error GoTo ERRHANDLER后,ERRHANDLER已启用 。然后,当发生错误时ERRHANDLER 已激活并处理错误。当GoTo EXITHANDLER它保持活动状态并仍然处理错误时。 On Error GoTo ERRHANDLER此时无效。

要重新启用ERRHANDLER,您需要使用Resume EXITHANDLER代替GoTo EXITHANDLER

Resume声明中

修改。有三种方法可以使用ResumeResumeResume NextResume label

没有参数的

Resume会导致代码在导致错误的行恢复。这显然必须非常小心,因为你必须绝对确定你已经解决了问题,否则你将陷入无限循环。

Resume Next会导致代码在导致错误的行之后的行恢复。

Resume LabelGoTo Label几乎相同,但是这样就退出错误处理程序并恢复正常的代码执行。错误处理程序重新启用。