【问题标题】:Converting multiple variables into values with excel pivot tables or power pivot使用 excel 数据透视表或电源数据透视表将多个变量转换为值
【发布时间】:2015-12-22 01:45:41
【问题描述】:

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

      week 1    week 2  week 3

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

我需要使用切片器来仅使用特定周,但只需更改周即可。如果我不受 excels 行数的限制,我将创建一个“DATE”变量,并将“第 1 周、第 2 周、第 3 周...”作为该变量的值,但这会导致行数过多(使用 52 周,因此 number_of_rows*52 行很快就会达到 100 万)。

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

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

【问题讨论】:

  • 您可以尝试使用OFFSET 定义的命名,该命名将基于单个单元格,并带有一个下拉菜单用于选择星期,这将返回您可以输入数据透视表的所需列?但是,这也取决于实际的数据集,因为这只是返回单列数据的可行解决方案
  • 1.我对OFFSET不熟悉,您能进一步解释或提供参考吗? 2. 为了澄清你的观点,你是说如果我在所有周之后都有列 TOTAL,我将无法同时呈现“week x”和“TOTAL”?

标签: excel pivot-table powerpivot


【解决方案1】:

一点 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 将其直接转换为数据透视表(尽管这样做可能需要几分钟)。

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多