Excel VBA pivot函数在逐步执行时起作用,但在运行时不起作用

Excel VBA pivot函数在逐步执行时起作用,但在运行时不起作用,vba,excel,pivot-table,Vba,Excel,Pivot Table,我试图设置几个简单的按钮来过滤工作簿中多张工作表上的多个数据透视。这里没什么好玩的!枢轴不共享公共源,因此切片器对我不起作用。但所有字段都共享一个我要筛选的公共字段名。 如果我单步执行(F8),我的代码可以运行,但是如果我尝试直接执行(F5),我会得到一个错误“代码执行被中断”,调试器会突出显示第一个和第二个。如果我注释掉修改过滤器的那行,不管我用哪种方式,函数都可以正常运行。请帮忙 Sub troubleshoot() Dim wks As Worksheet, strName As Str

我试图设置几个简单的按钮来过滤工作簿中多张工作表上的多个数据透视。这里没什么好玩的!枢轴不共享公共源,因此切片器对我不起作用。但所有字段都共享一个我要筛选的公共字段名。
如果我单步执行(F8),我的代码可以运行,但是如果我尝试直接执行(F5),我会得到一个错误“代码执行被中断”,调试器会突出显示第一个和第二个。如果我注释掉修改过滤器的那行,不管我用哪种方式,函数都可以正常运行。请帮忙

Sub troubleshoot()

Dim wks As Worksheet, strName As String, pvt As PivotTable, strPvtName As String

For Each wks In Worksheets
     strName = wks.Name
        For Each pvt In wks.PivotTables
        strPvtName = pvt.Name
        Debug.Print strName + " / " + strPvtName
        Sheets(strName).PivotTables(strPvtName).PivotFields("OrderSubType").ClearAllFilters
    Next
Next

Set wks = Nothing
Set pvt = Nothing

End Sub

下面是一种使用2 FOR循环遍历所有透视表并清除“OrderSubType”字段(当该字段存在时)上所有过滤器的方法。我还提出了一些错误处理

Public Sub troubleshoot()

    Application.ScreenUpdating = False
    On Error GoTo EndOfSub

    Dim wks As Worksheet, pvt As PivotTable, pvts As PivotTables
    Dim i As Integer, j As Integer

    For i = 1 To ThisWorkbook.Sheets.Count
         Set wks = ThisWorkbook.Sheets(i)
         Set pvts = wks.PivotTables 'GET PIVOTTABLES COLLECTION
         For j = 1 To pvts.Count
            Set pvt = pvts(j)
            Debug.Print wks.Name + " / " + pvt.Name
            If PivotContainsField(pvt, "OrderSubType") Then
                pvt.PivotFields("OrderSubType").ClearAllFilters 'CLEAR FILTERS
            Else
                Debug.Print "OrderSubType field not found in : " + pvt.Name
            End If
         Next j
    Next i

    Set wks = Nothing
    Set pvt = Nothing

EndOfSub:
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        MsgBox "Error : " & Err.Description
    End If
End Sub

Public Function PivotContainsField(pvt As PivotTable, fieldName As String) As Boolean
On Error Resume Next
    pvt.PivotFields (fieldName)
    PivotContainsField = (Err.Number = 0)
On Error GoTo 0
End Function
公共子故障排除()
Application.ScreenUpdating=False
关于错误转到EndOfSub
Dim wks作为工作表,pvt作为数据透视表,pvt作为数据透视表
尺寸i为整数,j为整数
对于i=1,请单击thiswook.Sheets.Count
Set wks=ThisWorkbook.Sheets(一)
Set pvts=wks.PivotTables的“获取数据透视表”集合
对于j=1到pvts.Count
设定pvt=pvts(j)
调试。打印工作名称+“/”+pvt.Name
如果数据透视包含字段(pvt,“OrderSubType”),则
pvt.PivotFields(“OrderSubType”).ClearAllFilters的CLEAR筛选器
其他的
在“+pvt.Name”中找不到Debug.Print“OrderSubType”字段
如果结束
下一个j
接下来我
设为零
设置pvt=Nothing
EndOfSub:
Application.ScreenUpdating=True
如果错误号为0,则
MsgBox“错误:&错误说明
如果结束
端接头
公共函数PivotContainsField(pvt作为数据透视表,fieldName作为字符串)作为布尔值
出错时继续下一步
pvt.PivotFields(字段名)
PivotContainsField=(Err.Number=0)
错误转到0
端函数

您是否尝试过将
用于i
用于j
而不是每个
使用2个
?有时,当您修改引用的对象或内容时,每停止一次循环内的工作,顺便说一句,此行
Sheets(strName).PivotTables(strPvtName).pivottfields(“OrderSubType”).ClearAllFilters
可以替换为
pvt.pivottfields(“OrderSubType”).ClearAllFilters
因为您已经有了对数据透视表对象的引用,所以缩短该行很有意义。我曾经有过这样的经历,但在我尝试排除故障时,我会不断改变。Re:您关于使用i&j的另一个建议,我需要对该工作簿的i=1执行类似于
的操作。工作表。对第一个循环进行计数,对吗?但是我还没有找到正确的方法来获得给定电子表格中用于第二个循环j的类似数据透视表的计数?我只知道足够的VBA让我自己陷入困境…好的-更正。我可以得到计数,我现在只是不能正确地把它们放在一起…似乎这个错误不是由我的代码引起的。在执行录制的宏时,我遇到了相同的错误,宏的所有步骤都与函数的预期步骤相同。很明显这有点问题。解决方案是切换到VBE窗口,执行Ctrl+Break/Pause。关闭VBE窗口,确定它将结束调试器。然后返回电子表格并运行宏-无错误。奇怪,但现在正在工作!