同步数据透视表 - VBA 代码不起作用

Posted

技术标签:

【中文标题】同步数据透视表 - VBA 代码不起作用【英文标题】:Sync Pivot tables - VBA code not working 【发布时间】:2016-05-17 10:33:22 【问题描述】:

我目前正在开发一个动态仪表板。我的计算表上有几个数据透视表,它们来自不同的来源,但具有相同的过滤选项(日期、代理名称等)。我的概览表从这些数据透视表中获取数据。这个想法是,基于连接到 1 个数据透视表的少数切片器,我可以更新其他数据透视表并使用概览表上的结果进行操作。

我使用下面的代码来同步过滤选项。当我在有数据透视表的工作表中进行更改时,此代码运行良好。但是,如果我将切片器转换为概览表并尝试使用数据进行操作,我的计算表上只会更新 1 个数据透视表,因此概览表上只会显示一半的信息。

代码被复制到概览表和计算表上。请帮忙。

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

Dim wsMain As Worksheet
Dim ws As Worksheet
Dim ptMain As PivotTable
Dim pt As PivotTable
Dim pfMain As PivotField
Dim pf As PivotField
Dim pi As PivotItem
Dim bMI As Boolean

On Error Resume Next
Set wsMain = ActiveSheet
Set ptMain = Target

Application.EnableEvents = False
Application.ScreenUpdating = False

For Each pfMain In ptMain.PageFields
    bMI = pfMain.EnableMultiplePageItems
    For Each ws In ThisWorkbook.Sheets("CalculationSheet")
        For Each pt In ws.PivotTables
            If ws.Name & "_" & pt <> wsMain.Name & "_" & ptMain Then
                pt.ManualUpdate = True
                Set pf = pt.PivotFields(pfMain.Name)
                        bMI = pfMain.EnableMultiplePageItems
                        With pf
                            .ClearAllFilters
                            Select Case bMI
                                Case False
                                    .CurrentPage = pfMain.CurrentPage.Value
                                Case True
                                    .CurrentPage = "(All)"
                                    For Each pi In pfMain.PivotItems
                                        .PivotItems(pi.Name).Visible = pi.Visible
                                    Next pi
                                    .EnableMultiplePageItems = bMI
                            End Select
                        End With
                        bMI = False

                Set pf = Nothing
                pt.ManualUpdate = False
            End If
        Next pt
    Next ws
Next pfMain

Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

【问题讨论】:

您好,您是否已经尝试修改切片器连接? 您好,如上所述,数据透视表具有不同的数据源,因此无法连接切片器连接。我可以用代码做到这一点,但结果真的很慢。更快的方法是将其直接应用于数据透视表。如果更改了一个数据透视表,则会影响另一个数据透视表,反之亦然。因此,将切片器添加到枢轴之一以控制其他枢轴的想法应该可行。它做得很完美,但是,如果切片器转到另一个页面,它只控制 1 个枢轴。 【参考方案1】:

我相信问题出在这一行:

For Each ws In ThisWorkbook.Sheets("CalculationSheet")

该行将代码限制为仅考虑名为“CalculationSheet”的工作表上的数据透视表。如果您希望它适用于工作簿中的所有工作表,请将其更改为:

For Each ws In ThisWorkbook.WorkSheets

...根据http://blog.contextures.com/archives/2012/01/03/change-all-pivot-tables-with-one-selection/的原始代码清单

【讨论】:

您好 jeffreyweir,感谢您的回复。我已将其更改为专门引用工作表,否则过滤器会发疯并且没有应用数据。代码在“.ClearAllFilters”处停止。

以上是关于同步数据透视表 - VBA 代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章

VBA自动刷新数据透视表

Excel 2013 过滤多个 OLAP 数据透视表

加快数据透视表过滤 VBA 代码

如何刷新数据透视图

如何用vba实现数据透视表自动筛选

VBA代码在数据透视表旁边的列中向下拖动公式