一点 VBA 将帮助您实现目标。从数据源创建一个新的数据透视表,该数据源只包含您希望在切片器中显示的周数。即“第 1 周”、“第 2 周”等。为该数据透视表创建一个切片器,当用户单击它时,捕获生成的 PivotTable_Update 事件并使用它来更改在现有主数据透视表中显示的周字段。
---编辑---
看起来是这样的:
...如果我从 Weeks 切片器中选择一个单一字段,会发生以下情况:
...如您所见,当您单击“虚拟”切片器时,数据透视表中的字段将被切换出来以匹配切片器选择。
下面是可让您执行此操作的代码。此代码位于标准代码模块中:
Option Explicit
Sub Pivots_SwitchFields(target As PivotTable)
Dim rngSelection As Range
Dim wks As Worksheet
Dim pt As PivotTable
Dim pf As PivotField
Dim pi As PivotItem
Dim lngOrientation As Long
Dim varFields As Variant
Dim varItem As Variant
Dim strInstructions As String
Dim lCalculation As Long
Dim bEnableEvents As Boolean
Dim bScreenUpdating As Boolean
With Application
lCalculation = .Calculation
bEnableEvents = .EnableEvents
bScreenUpdating = .ScreenUpdating
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
strInstructions = target.Name
Set rngSelection = target.RowRange
Set wks = ActiveWorkbook.Worksheets(Split(strInstructions, "|")(1))
Set pt = wks.PivotTables(Split(strInstructions, "|")(2))
pt.ManualUpdate = True
Select Case Split(strInstructions, "|")(3)
Case "Values": lngOrientation = xlDataField
Case "Rows": lngOrientation = xlRowField
Case "Columns": lngOrientation = xlColumnField
Case "Filters": lngOrientation = xlPageField
End Select
'Clear out the old field(s)
Select Case lngOrientation
Case xlDataField
For Each pf In pt.DataFields
pf.Orientation = xlHidden
Next pf
Case Else
For Each pf In pt.PivotFields
With pf
If .Orientation = lngOrientation Then
If Not .AllItemsVisible Then .ClearAllFilters
.Orientation = xlHidden
End If
End With
Next pf
End Select
'Add in the new field(s)
varFields = target.RowRange
On Error Resume Next
For Each varItem In varFields
With pt.PivotFields(varItem)
.Orientation = lngOrientation
If lngOrientation = xlDataField Then .Name = .SourceName & " "
End With
Next varItem
On Error GoTo 0
With Application
.EnableEvents = bEnableEvents
.ScreenUpdating = bScreenUpdating
.Calculation = lCalculation
End With
pt.ManualUpdate = False
End Sub
...此代码进入 ThisWorkbook 模块:
Private Sub Workbook_SheetPivotTableUpdate(ByVal Sh As Object, ByVal target As PivotTable)
If Split(target.Name, "|")(0) = "SwitchFields" Then Pivots_SwitchFields target
End Sub
请注意,我为 Hidden Pivot 指定了以下名称:
开关字段|Sheet1|数据透视表1|值
...在哪里 | character 是同时按 Shift 和 \ 得到的竖线字符。
您需要修改此名称以提供相关的工作表名称、数据透视表名称以及要切换出的字段的位置(即值、行、列、过滤器)
另一种选择是使用我在http://dailydoseofexcel.com/archives/2013/11/21/unpivot-shootout/ 发布的代码,使用一些SQL 将交叉表直接转换为数据透视表。查找我在该文章中“2013 年 11 月 26 日更新”标题下方发布的非常长的例程。如果它适合工作表,该例程会将交叉表转换为平面文件,否则通过 SQL 将其直接转换为数据透视表(尽管这样做可能需要几分钟)。