【问题标题】:Excel 2013 filtering on multiple OLAP pivot tablesExcel 2013 过滤多个 OLAP 数据透视表
【发布时间】:2016-04-06 14:39:01
【问题描述】:

这里是 VBA 新手。

虽然我能够使用我在网上找到的 VBA 代码之一同步多个本地数据透视表,但我正在努力解决以下问题:

我在一张纸上有 16 个 OLAP 连接的数据透视表。每个都有 6 个过滤器,其中 4 个过滤器是相同的。我希望能够使用这四个过滤器之一更改所有数据透视表。

【问题讨论】:

    标签: vba excel olap olap-cube


    【解决方案1】:

    您可以为这四个字段中的每一个插入一个切片器。添加后,您可以转到切片器连接并选择所有相关的枢轴。

    如果您正在寻找 VBA,则必须遍历工作表上的所有枢轴,然后遍历所有报表过滤器成员并将所选值存储到数组中。

    或者您可以在隐藏选项卡上创建切片器并使用 CUBERANKEDMEMBER 函数返回切片器的所有选择,然后使用它来构建您的数组并将其应用于您的所有数据透视表当您的任何报告过滤器更改(您可以在工作表中使用 Worksheet_PivotTableAfterValueChange 过程)

    以下是我们使用 2 个数据透视表的方法:

    Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    ''''variables for pivottable changed
        Dim pivotname As String
        Dim pivotname2 As String
        Dim PT As PivotTable
        Dim PT2 As PivotTable
    
    ''''variables for pivotrowfields
        Dim pti As PivotItem
        Dim pti2 As PivotField
    
    ''''variables for pagefilters
        Dim PF As PivotField
        Dim colPageFields As PivotFields
        Dim aFilters As Variant
    
    '''Un-enable events to avoid an endless loop
        Application.EnableEvents = False
    
    '''Set variables
        pivotname = Target.Name
    
        If pivotname = "PivotTable1" Then
            pivotname2 = "PivotTable4"
        Else
            pivotname2 = "PivotTable1"
            pivotname = "PivotTable4"
        End If
    
        If ActiveSheet.Name = "Slicer Setup" Then
            Sheets("By Org Structure").Activate
        End If
    
        Set PT = ActiveSheet.PivotTables("" & pivotname & "")
        Set PT2 = ActiveSheet.PivotTables("" & pivotname2 & "")
    
        Set colPageFields = PT.PageFields
    
    '''action for changing the filters on Page Fields
        For Each PF In colPageFields
    
                        PF.CubeField.EnableMultiplePageItems = True
                        'PT2.PivotFields(PF.Name).CubeField.EnableMultiplePageItems = True
                        aFilters = PT.PivotFields(PF.Name).VisibleItemsList
                        If aFilters(1) = "" Then
                            If PT.PivotFields(PF.Name).CubeField.AllItemsVisible = True Then
                                PT2.PivotFields(PF.Name).ClearAllFilters
                            Else
                                PT2.PivotFields(PF.Name).VisibleItemsList = Array("")
                            End If
                        Else
                            PT2.PivotFields(PF.Name).VisibleItemsList = Array(aFilters)
                        End If
    
        Next
    
    Set colPageFields = PT.RowFields
    
    '''action for changing the filters on Row Fields
        For Each PF In colPageFields
                         PF.CubeField.EnableMultiplePageItems = True
                        'PT2.PivotFields(PF.Name).CubeField.EnableMultiplePageItems = True
                        aFilters = PT.PivotFields(PF.Name).VisibleItemsList
                        If aFilters(1) = "" Then
                            If PT.PivotFields(PF.Name).CubeField.AllItemsVisible = True Then
                                PT2.PivotFields(PF.Name).ClearAllFilters
                            Else
                                PT2.PivotFields(PF.Name).VisibleItemsList = Array("")
                            End If
                        Else
                            PT2.PivotFields(PF.Name).VisibleItemsList = Array(aFilters)
                        End If
        Next
    
    
    '''Re-enable events to allow for this event macro to be kicked off again next time pivottables are changed
        Application.EnableEvents = True
    
        ActiveWorkbook.ShowPivotTableFieldList = False
    
    End Sub
    

    【讨论】:

    • 似乎我无法链接切片器,因为数据透视表具有分组字段并且基于 OLAP。我是否正确地假设我需要在调整 VBA 代码时将所有数据透视表变暗并为它们复制代码?
    • 使用 for 或 for 循环遍历枢轴可能会更干净、更短。
    猜你喜欢
    • 2010-11-28
    • 2021-07-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多