仅在已过滤的PivotItems上执行循环

我想总结符合某些标准的PivotTable的一些PivotTableDataRange.Value ,我不想每当PageFilter改变时都这样做。 这是我的代码:

 Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Dim pt As PivotTable, pi As PivotItem, q as Double Set pt = ActiveSheet.PivotTables(1) q = 0 For Each pi In pt.PivotFields(1).PivotItems If pi.Name = someCriteria Then q = q + pi.DataRange.Value End If Next pi End Sub 

每当PT发生变化(显然)时,代码就会运行,并且运行得非常好,直到PageFilter隐藏与someCriteria匹配的项目,然后发生1004 Error ,因为它无法检索到piDataRange属性。

两个问题:

(在这种情况下)是否有一种方法来运行代码只有当一个PageFilter更改(或必须完成一个Worksheet_Change事件)?

只有在过滤的项目中,我如何运行我的For-Loop

我已经想出了一个解决scheme,做一些error handling,但我猜测必须有一个更优雅的方式来做到这一点。

谢谢。

我无法重现你的错误。 如果我创build一个带有页面项“Test”和“Test2”的简单数据透视表,并将页面filter更改为不显示“test”,则不会收到错误1004.将someCriteria设置为等于“Test”。 我得到一个错误13types不匹配,无论是“testing”隐藏或不,因为它试图增加一个范围到q。

错误13

debugging器突出显示的行是“q = q + pi.DataRange.Value”。

请注意pi.DataRange的地址不是真的取决于是否在页面filter中selecttesting。 例如,在图片中selectTest2并且pi.DataRange.Address等于B4:B5。

因此,如果我将代码更改为以下代码,则运行时不会出现错误,但即使未选中“testing”,结果也为3:

 Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Dim pt As PivotTable, pi As PivotItem, q As Double Dim someCriteria As String Dim cell As Excel.Range someCriteria = "test" Set pt = ActiveSheet.PivotTables(1) q = 0 For Each pi In pt.PivotFields(1).PivotItems If pi.Name = someCriteria Then For Each cell In pi.DataRange q = q + cell.Value Next cell Debug.Print q End If Next pi End Sub 

因为我不能重复你最初的成功或者具体的失败,我显然没有太大的帮助。 也许关于你的数据透视表的结构更多的细节,我可以。

我可以肯定地说,如果只想捕获页面filter中的更改,则需要按照您的怀疑closuresWorksheet_Change事件。