我想对符合特定条件的 PivotTable
的某些 PivotItems
的 DataRange.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 错误
发生,因为它无法检索 pi
的 DataRange
属性。
两个问题:
(在这种情况下)有没有办法仅在 PageFilter
更改时运行代码(或者必须通过 Worksheet_Change
事件完成)?
如何仅在已过滤的项目中运行我的 For-Loop
?
我已经找到了一个进行一些错误处理的解决方案,但我猜必须有一种更优雅的方法来做到这一点。
谢谢。
最佳答案
我无法重现您的错误。如果我创建一个包含页面项“Test”和“Test2”的简单数据透视表,并将页面过滤器更改为不显示“test”,则不会收到错误 1004。其中 someCriteria 设置为等于“Test”。我确实收到错误 13 Type Mismatch,无论“Test”是否隐藏,因为它试图向 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 事件进行编码,正如您所怀疑的那样。
关于excel - 仅对过滤后的 PivotItems 执行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628333/