仅在过滤的PivotItem上执行循环

时间:2012-03-09 02:56:53

标签: excel excel-vba pivot-table vba

我想对符合特定条件的DataRange.Value PivotItems的{​​{1}}求和,每次PivotTable更改时我都不会这样做。这是我的代码:

PageFilter

代码在每次PT更改时运行(显然),运行得非常好,直到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 隐藏匹配PageFilter的项目,然后someCriteria发生,因为它可以不要追溯1004 Error的{​​{1}}属性。

两个问题:

(在此上下文中)是否有办法仅在DataRange更改(或必须使用pi事件完成)时运行代码?

如何仅在过滤后的项目中运行PageFilter

我已经找到了一个解决方案来进行一些错误处理,但我猜测必须有更优雅的方法来实现它。

感谢。

1 个答案:

答案 0 :(得分:1)

我无法重现您的错误。如果我使用页面项“Test”和“Test2”创建一个简单的数据透视表,并将页面过滤器更改为不显示“test”,则不会出现错误1004.将someCriteria设置为等于“Test”。我确实收到错误13类型不匹配,是否隐藏“测试”,因为它试图向q添加范围。

Error 13

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

请注意,pi.DataRange的地址实际上并不取决于是否在页面过滤器中选择了Test。例如,在图片中选择Test2并且pi.DataRange.Address等于B4:B5。

因此,如果我将代码更改为以下代码,它会正常运行,但即使未选择“测试”,也会导致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

因为我不能复制你的初步成功或特定的失败,所以我显然没有多少帮助。也许有关于数据透视表结构的更多细节,我可以。

我可以肯定地说,如果您只想捕获页面过滤器中的更改,则需要按照您的怀疑来编写Worksheet_Change事件的代码。