我想对符合特定条件的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
?
我已经找到了一个解决方案来进行一些错误处理,但我猜测必须有更优雅的方法来实现它。
感谢。
答案 0 :(得分:1)
我无法重现您的错误。如果我使用页面项“Test”和“Test2”创建一个简单的数据透视表,并将页面过滤器更改为不显示“test”,则不会出现错误1004.将someCriteria设置为等于“Test”。我确实收到错误13类型不匹配,是否隐藏“测试”,因为它试图向q添加范围。
调试器突出显示的行是“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事件的代码。