使用VBA将切片器连接到所有数据透视表?

问题描述 投票:0回答:1

我正在编写 VBA 代码来生成一系列 12 个数据透视表,这些数据透视表都连接到相同的切片器。

为了将切片器连接到数据透视表,我实现了一种循环方法,其中通过代码生成第一个数据透视表,然后所有切片器都连接到该数据透视表。然后将第一个数据透视表复制并粘贴到右侧偏移 2 列、清除、重命名,然后填充相关的数据透视表字段。然后对剩余的数据透视表重复此操作。

这是代码示例:

Sub Pivot_Generation()

Application.ScreenUpdating = False
    
    Sheets("Pivots").Activate

Dim TblNam As String
Dim TblRk As Integer

TblRank = 1

' Creation of the first pivot table

    ThisWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
        ThisWorkbook.Connections("ThisWorkbookDataModel"), Version:=6). _
        CreatePivotTable TableDestination:="Pivots!R3C3", tableName:= _
        "NewPivot", DefaultVersion:=6

    For i = 1 To 3
        If TblRank = 1 Then
            TblNam = "Pivot1” 
        ElseIf TblRank = 2 Then
            TblNam = " Pivot2 "
        ElseIf TblRank = 3 Then
            TblNam = " Pivot3 "
        End If

    If TblRank = 1 Then
        ActiveSheet.pivotTables(1).name = TblNam
        Pivot1_Fields
        Slicers
    Else:
        ActiveSheet.pivotTables(1).TableRange1.Select
        Selection.Copy
        Selection.Cells(1, 1).Select
        Selection.End(xlToRight).End(xlToRight).End(xlToLeft).Offset(0, 2).Select
        ActiveSheet.Paste
        ActiveSheet.pivotTables(1).ClearTable
        ActiveSheet.pivotTables(1).name = TblNam

            If TblRank = 2 Then
                Pivot2_Fields
            ElseIf TblRank = 3 Then
                Pivot3_Fields
            End If
        End If
        TblRank = TblRank + 1

    Next i
End Sub

模块“Slicers”用于生成切片器并将其连接到第一个数据透视表,如下所示:

Sub Slicers()

Dim conc As Worksheet
Set conc = Sheets("Pivots")

'Visible Slicers

    ThisWorkbook.SlicerCaches.Add2(conc.pivotTables("Pivot1"), _
        "[ORDER_DATA].[account_status]").Slicers.Add conc, _
        "[ORDER_DATA].[account_status].[account_status]", _
        "Account Status", "Account Status", 30, 0, 135, 90

    ThisWorkbook.SlicerCaches.Add2(conc.pivotTables("Pivot1"), _
        "[ORDER_DATA].[order_type]").Slicers.Add conc, _
        "[ORDER_DATA].[order_type].[order_type]", _
        "Order Type", "Order Type", 135, _
        0, 135, 105

    ThisWorkbook.SlicerCaches.Add2(conc.pivotTables("Pivot1"), _
        "[ORDER_DATA].[store_id]").Slicers.Add conc, _
        "[ORDER_DATA].[store_id].[store_id]", "Store ID" _
        , "Store ID", 255, 0, 135, 90

End Sub

这是我遇到的问题。尽管此方法过去已成功确保所有数据透视表都连接到相同的切片器,但它不再起作用。现在,它仅将切片器连接到第一个数据透视表,而不会在复制后连接到其余的数据透视表。我能想到的唯一解决方案是使用模块手动将所有切片器连接到所有数据透视表,这并不理想,因为这会增加仪表板生成的时间。

我可以使用更有效的方法来确保所有数据透视表都连接到相同的切片器吗?

excel vba pivot-table
1个回答
0
投票
  • 如果在复制数据透视表之前创建切片器,则新的数据透视表应连接到切片器。我已经在 Excel 365 上测试过,没有任何问题。

  • 如果由于未知原因它在您端不起作用,您可以使用以下代码将所有切片器连接到所有数据透视表。

Option Explicit

Sub demo()
    Dim Sc As SlicerCache, Pvt As PivotTable
    For Each Sc In ActiveWorkbook.SlicerCaches
        For Each Pvt In ActiveSheet.PivotTables
            Sc.PivotTables.AddPivotTable Pvt
        Next
    Next
End Sub

© www.soinside.com 2019 - 2024. All rights reserved.