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

时间:2015-09-24 12:42:20

标签: excel pivot-table powerpivot

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

      week 1    week 2  week 3

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

我需要使用切片器仅使用特定周,但只需更改一周。如果我没有受到行数的限制,我会创建一个" DATE"变量,并且有第1周,第2周,第3周..."是该变量的值,但这会产生太多行(使用52周,因此number_of_rows * 52行最快会达到100万行)。

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

我可以用另一种语言来做这件事,我受到其他人的工作技能的限制,因此需要一种方法在一个简单的工具中使用它。

1 个答案:

答案 0 :(得分:2)

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

--- ---编辑 这是看起来如何: enter image description here

...如果我从Weeks切片器中选择一个单个字段会发生什么: enter image description here

...正如您所看到的,当您单击“虚拟”切片器时,字段将在数据透视表中切换出来以匹配切片器选择。

这是允许您这样做的代码。此代码位于标准代码模块中:

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提供了以下名称: SwitchFields | Sheet1中| PivotTable1 |价值观 ......那里的那个character是通过按Shift和\得到的管道字符。

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

另一种选择是使用我在http://dailydoseofexcel.com/archives/2013/11/21/unpivot-shootout/发布的代码,使用一些SQL将交叉表直接转换为数据透视表。请查看我在该文章“2013年11月26日更新”标题下面发布的非常长的例行程序。该例程将交叉表转换为平面文件(如果它适合表单),否则通过SQL将其直接转换为数据透视表(尽管可能需要几分钟才能完成)。