【问题标题】:Set multiple slicers at once in Excel在 Excel 中一次设置多个切片器
【发布时间】:2017-10-03 15:46:28
【问题描述】:

我有一个带有两个具有完全相同切片器的数据透视表的工作簿。我正在使用 VBA 脚本来同步两个切片器。我将它们命名为“Slicer_xxxx_Master”,另一个为“Slicer_xxxx_Slave”。

下面的代码可以正常工作,除了有很多选项的切片器。由于它会一一设置切片,因此它会一遍又一遍地重新过滤数据透视表,直到设置了所有需要的切片。

有没有一种方法可以将所有切片项的值收集到一个数组中,然后一次性设置 Slave 切片器的值?

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Application.ScreenUpdating = False

Dim sC As SlicerCache
Dim sC_Slave As SlicerCache
Dim SL As SlicerCacheLevel
Dim sI As SlicerItem
Dim sI_Slave As SlicerItem


For Each sC In ActiveWorkbook.SlicerCaches
    If InStr(1, sC.Name, "Master") Then
        Set sC_Slave = ThisWorkbook.SlicerCaches(Replace(sC.Name, "Master", "Slave"))
        For Each sI In sC.SlicerItems
            If sI.Name <> ("(blank)") Then
                Set sI_Slave = sC_Slave.SlicerItems(sI.Name)
                If sI_Slave.Selected <> sI.Selected Then
                    sI_Slave.Selected = sI.Selected
                End If
            End If
        Next
    End If
Next

Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 几个问题:首先,我们在这里谈论的是 Table Slicers 还是 PivotTable Slicers。我假设枢轴。如果是这样,枢轴“传统”枢轴是基于工作簿中的范围,还是基于 OLAP/PowerPivot 模型?它们是基于完全相同的数据源(在这种情况下,您只需修改 SlicerConnections 属性,以便它们在没有代码的情况下同步每个枢轴)还是不同的缓存?
  • 您好,谢谢。数据透视表切片器,传统的数据透视表。它们具有单独的数据集,但两个集具有完全相同的切片字段。每个数据透视表实际上有 5 个单独的切片器,但它们都分别命名为“Master”和“Slave”。主切片器在仪表板表上可见,从切片器隐藏在与数据透视表相同的表上,因此只需单向同步即可。

标签: vba excel pivot-table


【解决方案1】:

我只在从数据透视表上使用了 ManualUpdate = FALSE 和断开/重新连接功能,情况比以前好得多。谢谢杰弗里!

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Application.EnableEvents = False
Application.ScreenUpdating = False

Dim sC As SlicerCache
Dim sC_Slave As SlicerCache
Dim sI As SlicerItem
Dim sI_Slave As SlicerItem
Dim wS As Worksheet
Dim pT As PivotTable

Set wS = ThisWorkbook.Worksheets("Totals Pivot")
wS.PivotTables("TotalsPivot").ManualUpdate = True

For Each sC In ThisWorkbook.SlicerCaches
    If InStr(1, sC.Name, "Master") Then
        Set sC_Slave = ThisWorkbook.SlicerCaches(Replace(sC.Name, "Master", "Slave"))
        sC_Slave.PivotTables.RemovePivotTable ("TotalsPivot")

        For Each sI In sC.SlicerItems
            Set sI_Slave = sC_Slave.SlicerItems(sI.Name)
            If sI_Slave.Selected <> sI.Selected Then
                sI_Slave.Selected = sI.Selected
            End If
        Next

        sC_Slave.PivotTables.AddPivotTable wS.PivotTables("TotalsPivot")
    End If
Next

wS.PivotTables("TotalsPivot").ManualUpdate = False

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

【讨论】:

    【解决方案2】:

    如果您使用的是 Excel 2013 或更高版本,则可以将每个数据源添加到 DataModel,然后只需定义它们之间的关系。然后一个切片器将统治它们,这将比将事物分开要快得多,因为 OLAP/PowerPivot PivotTables 只需输入一个数组 (VisiblieItemsList),它可以一次性告诉它们要显示什么。

    但是,如果您想将事情分开,那么在更改 PivotItems 的状态时加快速度(无论是直接还是通过切片器),您至少应该将每个数据透视表的 .ManualUpdate 属性设置为 TRUE,以停止每次更改 SlicerItem 后数据透视表都会更新。

    鉴于我们在此处处理 Slicers,您可以通过执行以下操作(并将 Pivots 的 .ManualUpdate 属性设置为 FALSE)来真正让例程超速运行:

    1. 暂时断开切片器与主从设备的连接
    2. 像上面那样遍历切片器缓存
    3. 将切片器重新连接到主设备和从设备。

    这又快得多的原因是切片器的实现方式似乎存在一个错误,因为每当您更改切片器项目的状态时,它都会导致数据透视表更新...即使您已设置将 PivotTables .ManualUpdate 设置为 true,正如我在 here 写的一篇博文中所述

    我在编程数据透视表here 时写了一篇帖子覆盖瓶颈,这可能会很有趣,以及在 SO 上可能值得一看的一些问题的答案,例如 this one

    【讨论】:

    • 谢谢杰弗里!这是一个很好的提示。我的公司仍在为我提供 2010,所以我不能使用 DataModel,尽管这听起来像是我会考虑实施的东西。不过,我会担心分发文件,因为用户可能仍在使用 2010。现在我使用了 .ManualUpdate = TRUE 函数,它显着改善了等待时间。这很容易解决!当我有更多时间时,我会看看你的替代方法。我肯定很感兴趣。
    • 酷。如果我今天有时间,我会发布一些采用这种方法的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2017-09-10
    • 2019-04-02
    相关资源
    最近更新 更多