迭代数据透视表

时间:2018-03-26 18:05:56

标签: vba excel-vba excel

我有代码遍历数据透视表中的每个PivotItem。我在下面显示的代码是一种更手动的方法。我的循环保持PivotItem不在数据透视表中显示的内容,因为数据透视表上有一个过滤器来限制事物。所以假设我使用.PivotItems("BMR")并且代码工作正常,因为要在数据透视表中显示BMR PivotItems。但是,如果我执行.PivotItems("EHFG")它将会出错,因为它不在数据透视表中,因为它被过滤掉了。

如何调整代码以使其不会在不存在的数据透视表项上中断?如果它不存在,可以跳过With语句?

Option Explicit
Sub test()

    Dim PvtTbl As PivotTable
    Dim columnsDifference As Long
    Dim PvtFld As PivotField

    Set PvtTbl = Sheets("NIR Pivot").PivotTables("NIR_Pivot")
    Set PvtFld = PvtTbl.PivotFields("Prod. Code")

    PvtFld.PivotItems("EHFG").ShowDetail = True 'Show pivot item


    columnsDifference = PvtTbl.TableRange2.Columns.Count - PvtTbl.DataBodyRange.Columns.Count
    With PvtTbl.PivotFields("Prod. Code").PivotItems("EHFG").DataRange **ERRORS HERE
   '     Debug.Print .Offset(, -columnsDifference).Resize(.Rows.Count, .Columns.Count + columnsDifference).Address
        .Offset(, -columnsDifference).Resize(.Rows.Count, .Columns.Count + columnsDifference).Select
    End With

End Sub

1 个答案:

答案 0 :(得分:1)

尝试下面修改后的For Each循环代码:

Dim Pvtitm As PivotItem ' define pivot-item object

' loop thorugh all Pivot-items in Pivot Field "Prod. Code"
For Each Pvtitm In PvtFld.PivotItems
    ' check if current Pivot item is filtered out
    If Pvtitm.Visible = True Then
        With Pvtitm.DataRange
            'Debug.Print .Offset(, -columnsDifference).Resize(.Rows.Count, .Columns.Count + columnsDifference).Address
            .Offset(, -columnsDifference).Resize(.Rows.Count, .Columns.Count + columnsDifference).Select
        End With
    Else
        MsgBox "Pivot-Item " & Pvtitm.Name & " is filtered out", vbInformation
    End If

Next Pvtitm

注意:不确定为什么需要Select范围?