【问题标题】:Excel VBA pivot function works when stepped-through but not when runExcel VBA 数据透视函数在单步执行时有效,但在运行时无效
【发布时间】:2015-07-31 15:21:23
【问题描述】:

我正在尝试设置几个简单的按钮来过滤工作簿内多个工作表上的多个枢轴。这里没有什么花哨的!枢轴不共享一个共同的来源,所以切片器不适合我。但它们都共享一个我想过滤的通用字段名称。
如果我单步执行 (F8) 我的代码可以工作,但如果我尝试直接执行 (F5) 我会收到“代码执行已中断”的错误,并且调试器会突出显示第一个 Next。如果我注释掉修改过滤器的行,无论我采用哪种方式,该函数都会运行良好。请帮忙?

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

【问题讨论】:

  • 你试过用FOR iFOR j代替2FOR EACH吗?有时,当您修改引用的对象或内容时,FOR EACH 会在循环内停止工作
  • 顺便说一句,这行Sheets(strName).PivotTables(strPvtName).PivotFields("OrderSubType").ClearAllFilters 可以替换为pvt.PivotFields("OrderSubType").ClearAllFilters,因为您已经引用了数据透视表对象
  • 关于缩短线路的好点。我曾经在某个时候遇到过这种情况,但在尝试排除故障时会不断改变。回复:您对使用 i 和 j 的其他建议,我需要为第一个循环执行类似 For i = 1 To ThisWorkbook.Worksheets.Count 的操作,对吗?但是我还没有想出正确的方法来获得给定电子表格中数据透视表的相似数量,以便在第二个循环中用于 j ?我知道的 VBA 足以让自己陷入困境......
  • OK - 更正。我可以数数,但我现在无法正确地将它们组合在一起......
  • 似乎该错误不是由我的代码专门引起的。在执行我的函数打算执行的所有相同步骤的录制宏时,我遇到了同样的错误。显然这是一个小错误。解决办法是切换到VBE窗口,做Ctrl+Break/Pause。关闭 VBE 窗口,确定它将结束调试器。然后返回电子表格并运行宏 - 没有错误。奇怪,但现在可以工作了!

标签: vba excel pivot-table


【解决方案1】:

这是一种使用 2 FOR LOOP 遍历所有数据透视表并清除“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多