excel - 仅对过滤后的 PivotItems 执行循环

标签 excel pivot-table vba

我想对符合特定条件的 PivotTable 的某些 PivotItemsDataRange.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 错误 发生,因为它无法检索 piDataRange 属性。

两个问题:

(在这种情况下)有没有办法仅在 PageFilter 更改时运行代码(或者必须通过 Worksheet_Change 事件完成)?

如何仅在已过滤的项目中运行我的 For-Loop

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

谢谢。

最佳答案

我无法重现您的错误。如果我创建一个包含页面项“Test”和“Test2”的简单数据透视表,并将页面过滤器更改为不显示“test”,则不会收到错误 1004。其中 someCriteria 设置为等于“Test”。我确实收到错误 13 Type Mismatch,无论“Test”是否隐藏,因为它试图向 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 事件进行编码,正如您所怀疑的那样。

关于excel - 仅对过滤后的 PivotItems 执行循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628333/

相关文章:

excel - 同时卡住第 1 行和 A 列

excel - 过滤列表时 ListRows.Add() 给出错误

pandas - 使用 Pandas 计算数据透视表中的 boolean 值

php - PHP中的子查询将数据提取到Excel

Python openpyxl load_workbook 错误 : TypeError (NoneType not Iterable) and ValueError (Max. 值为 180)

r - 带有列对的 pivot_longer

Excel:数据透视表不过滤

vba - 将文件保存到 OneDrive/Sharepoint

c++ - 如何在 C++ 中捕获错误并调试在 Visual Studio 2010 下创建的 Excel DLL 加载项?

ms-access - MS Access 2007 使用 VBA 打开特定记录的单独表单