如何在Excel中使用多个切片器链接表和数据透视表?

时间:2018-08-03 19:52:53

标签: pivot-table slicers

关于使用切片器链接表和数据透视表,我有同样的问题。 [jeffreyweir]提供的ansewr非常完美!但就我而言,我将需要使用3个或更多不同切片器的解决方案。

可以通过以下链接找到初始解决方案:How to link a Table and a Pivot Table using Slicers in Excel?

提前很多次,希望我以正确的方式遵守了这个奇妙网站的规则! ;-)

2 个答案:

答案 0 :(得分:0)

好的,所以我修改了代码,使其仅需要数据透视表切片器,并且使用这些切片器设置直接过滤表。请注意,您需要在代码中更改以下几行以匹配Table和PivotTable的名称:

Const sPivot As String = "PivotTable1" '<= Change name as appropriate

Const sTable As String = "Table1" '<= Change name as appropriate

此代码必须粘贴到工作表所在的工作表模块中,其中所涉及的表/数据透视表是:

enter image description here

Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim sLastUndoStackItem As String
Dim sc          As SlicerCache
Dim si          As SlicerItem
Dim vItems      As Variant
Dim i           As Long
Dim lo          As ListObject
Dim lc          As ListColumn
Dim sTest       As String

Const sPivot As String = "PivotTable1" '<= Change name as appropriate
Const sTable As String = "Table1" '<= Change name as appropriate

If Target.Name = sPivot Then
    On Error Resume Next 'in case the undo stack has been wiped or doesn't exist
    sLastUndoStackItem = Application.CommandBars(14).FindControl(ID:=128).List(1) 'Standard Commandbar, undo stack
    'The above line doesn't seem to work in my version of O365 so we'll use the English language backup
    If sLastUndoStackItem = "" Then sLastUndoStackItem = Application.CommandBars("Standard").Controls("&Undo").List(1)
    On Error GoTo 0

    If sLastUndoStackItem = "Filter" Or sLastUndoStackItem = "Slicer Operation" Then

        Set lo = Range(sTable).ListObject

        For Each sc In ActiveWorkbook.SlicerCaches
            On Error Resume Next
            sTest = sc.PivotTables(1).Name
            On Error GoTo 0
            If sTest = sPivot Then
                Set lc = lo.ListColumns(sc.SourceName)
                If sc.FilterCleared Then
                    lo.Range.AutoFilter Field:=lc.Index
                Else
                    ReDim vItems(1 To 1)
                    For Each si In sc.SlicerItems
                        If si.Selected Then
                            i = i + 1
                            ReDim Preserve vItems(1 To i)
                            vItems(i) = si.Name
                        End If
                    Next si

                    lo.Range.AutoFilter Field:=lc.Index, Criteria1:=vItems, Operator:=xlFilterValues
                    ReDim vItems(1 To 1)
                End If
            End If
        Next sc
    End If
End If


End Sub

在这里起作用:

enter image description here

enter image description here

enter image description here

答案 1 :(得分:0)

对于将数据表与数据透视表放在不同工作表中的人,只需更改

Set lo = Range(sTable).ListObject

Set lo = Sheets("table_sheet_name").Range(sTable).ListObject

并将代码存储在数据透视表工作表模块中。