使用Excel数据透视表或功率透视将多个variables转换为值
我必须使用excel来解决这个问题。 我需要知道如何从一个非常大的数据集中创build一个数据透视表,这个数据集的结构如下:
week 1 week 2 week 3
第1行
第2行
第3行
第4行
我需要使用切片机只使用特定的星期,但简单地改变一周。 如果我没有受到行数的限制,我会创build一个“DATE”variables,并将“第1周,第2周,第3周…”作为该variables的值,但是这会导致太多的行使用52周,所以number_of_rows * 52行很快就达到100万)。
是否有可能在excel中创build一个“X周”的切片机的数据透视表,使每行的值显示所需的一周,而不创build一个新的variables,并显着增加行数?
我可以用另一种语言来做到这一点,我被其他人的工作技能所束缚,因此需要一种方法来做到这一点,在他们使用一个简单的工具。
一点VBA会让你在那里。 从数据源中创build一个新的数据透视表,其中包含您希望在分割器中显示的周数。 即“第一周”,“第二周”等。为该数据透视表创build一个切片器,当用户点击它时,捕获生成的PivotTable_Update事件并使用它来更改在现有的主数据透视表中显示的星期字段。
—编辑—这是看起来如何:
…以下是如果我从该星期切片机中select一个单独的字段会发生什么情况:
…如您所见,当您单击“虚拟”切片器时,字段会在数据透视表中切换以匹配切片器select。
这是允许你这样做的代码。 这段代码进入一个标准的代码模块:
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
请注意,我给了隐藏枢轴以下名称:SwitchFields | Sheet1 | PivotTable1 |值…在哪里| 字符是通过按住Shift和\来获得的pipe道字符。
您将需要修改此名称以提供相关的工作表名称,数据透视表名称以及要转出的字段的位置(即值,行,列,filter)
另一种select是使用我在http://dailydoseofexcel.com/archives/2013/11/21/unpivot-shootout/上发布的代码,使用某些SQL将交叉表直接转换为数据透视表。 请看那篇文章中标题为“2013年11月26日更新”下的非常长的例程。 如果该交叉表适合表单,那么该例程会将交叉表转换为平面文件,否则通过SQL将其直接转换为数据透视表(尽pipe这可能需要几分钟的时间才能完成)。