使用 excel 数据透视表或幂数据透视表将多个变量转换为值

Converting multiple variables into values with excel pivot tables or power pivot

我必须使用 excel 来解决这个问题。我需要知道如何从简化结构的非常大的数据集创建数据透视表 table,如下所示:

      week 1    week 2  week 3

第 1 行
第 2 行
第 3 行
第 4 行

我需要使用切片器来仅使用特定周,但只需简单地更改周。如果我不受 excel 行数的限制,我会创建一个 "DATE" 变量,并让 "week 1, week 2, week 3..." 成为该变量的值,但这会导致行数过多(使用52 周,所以 number_of_rows*52 行很快达到 100 万)。

是否可以在 excel 中创建数据透视表 table,并在 "week X" 上使用切片器,以便在不创建新变量的情况下显示所需周内每一行的值并显着增加行数?

我可以用另一种语言做到这一点,我受制于其他人的工作技能,因此需要一种简单的工具来做到这一点,供他们使用。

一点点 VBA 就能让你到达那里。从数据源创建一个新的数据透视表,该数据源只包含您想要在切片器中显示的周数。即 'Week 1'、'Week 2' 等。为该数据透视表创建一个切片器,当用户单击它时,捕获生成的 PivotTable_Update 事件并使用它来更改显示在您的周中的字段现有的主数据透视表。

---编辑--- 这是它的样子:

...如果我 select 来自那个 Weeks 切片器的单个字段,会发生什么:

...如您所见,当您单击 'dummy' 切片器时,数据透视表中的字段将被切换以匹配切片器 selection。

这是让您执行此操作的代码。此代码进入标准代码模块:

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

请注意,我为隐藏枢轴指定了以下名称: 切换字段|工作表 1|数据透视表 1|值 ...在哪里| character 是同时按 Shift 和 \ 得到的管道字符。

您需要修改此名称以提供相关的 sheet 名称、数据透视表名称和要切换的字段的位置(即值、行、列、过滤器)

另一种选择是使用我在 http://dailydoseofexcel.com/archives/2013/11/21/unpivot-shootout/ 发布的代码,使用一些 SQL 将交叉表直接转换为数据透视表。查找我在那篇文章的标题 "Update 26 November 2013" 下方发布的非常长的例程。如果它适合 sheet,该例程会将交叉表转换为平面文件,否则通过 SQL 将其直接转换为数据透视表(尽管这样做可能需要几分钟)。