仅对筛选后的数据透视表项执行循环。

3

我希望能够对符合特定条件的数据透视表 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

我已经想出了一个解决方案进行一些错误处理,但我想知道是否有更优雅的方法来解决它。

谢谢。

1个回答

1

我无法重现您的错误。如果我创建一个简单的数据透视表,其中页面项目为“测试”和“测试2”,并将页面筛选器更改为不显示“测试”,那么我就不会收到1004错误。这是因为某些条件设置为“测试”。无论“测试”是否隐藏,我都会收到13类型不匹配的错误,因为它试图将范围添加到q。

Error 13

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

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

因此,如果我将代码更改为以下内容,则可以无错误运行,但结果为3,即使未选择Test:

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事件中编写代码,正如您所怀疑的那样。

很聪明。我会只使用Worksheet_Change并检查更改的单元格是否在数据透视表的筛选器范围内。您可以检查命名范围,或编程确定报告筛选器范围。我会选择第一种方法,除非数据透视表可能会移动。 - Doug Glancy
关于筛选器更改,我不得不使用PivotTable_Update事件和Worksheet_Change事件的组合来捕获它,因为无法将筛选器与表格的其余部分隔离开来。任何对数据透视表的更改(不仅仅是筛选器)都会触发宏。关于for-loop,我不明白为什么你会遇到13错误,而我从未遇到过。另一方面,我确定我一直在错误地引用PivotItems。实际的PivotField是一个RowField,并且它是层次结构中的第二个。在实际代码中,我通过名称引用它,这可能会导致问题。 - Pragabhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接