我一直在尝试使用我尝试过的函数对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 似乎只能工作一次,无论它放在多高位置?
非常感谢帮助。提前谢谢!
答案 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
声明中 修改。有三种方法可以使用Resume
:Resume
,Resume Next
和Resume label
Resume
会导致代码在导致错误的行恢复。这显然必须非常小心,因为你必须绝对确定你已经解决了问题,否则你将陷入无限循环。
Resume Next
会导致代码在导致错误的行之后的行恢复。
Resume Label
与GoTo Label
几乎相同,但是这样就退出错误处理程序并恢复正常的代码执行。错误处理程序重新启用。