我有代码遍历数据透视表中的每个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
答案 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
范围?