在 Excel 中旋转而不聚合,以显示文本而不是数字?

Pivot in Excel without aggregation, to show text, not numbers?

假设我有这样一个 table:

Country Region  Mytext
USA     North   a
USA     South   b
Brasil  North   c
Brasil  South   d

如何在 Excel 中获得这样的枢轴?

Country  North         South
USA      a             b
Brasil   c             d

如果 'mytext' 是一个数字,我可以做一个主元 table:因为每个国家和地区的组合只有一行,min = max = sum = avg 和任何这些事实上,聚合函数会显示我想要的结果。

但是当我想要的字段不是数字时怎么办?使用 Python 的 pandas 库,我什至可以在非数字字段上使用 dataframe.pivot() 方法,但我还没有找到在 [=24 中执行相同操作的方法=].我可以将一个数字与每一行相关联,在 Excel 中执行枢轴以显示该数字,然后进行查找以获取关联的文本,但这似乎是一个相当复杂的过程,实际上应该更容易!

将 MyText 添加为 Country 标签下方的行标签,然后在 Pivot Table 设计选项卡下以表格格式显示 PivotTable。为国家行标签字段重复项目标签。

这可以完成,但需要 VBA 暂时用一些文本覆盖数据透视表中的数字 'placeholder' 值。要启用此功能,您需要为数据透视表设置 EnableDataValueEditing = True。刷新时,您然后查找数字占位符值,并将其替换为文本。令人费解,是的。解决方法,是的。但它确实有效。请注意,这只会 'sticks' 直到下一次刷新数据透视表,因此需要在每次刷新时触发此代码。

这是我在自己的一个项目中用来执行此操作的代码。将其放入标准代码模块中:

Function Pivots_TextInValuesArea(pt As PivotTable, rngNumeric As Range, rngText As Range, Optional varNoMatch As Variant)

Dim cell As Range
Dim varNumeric As Variant
Dim varText As Variant
Dim varResult As Variant
Dim bScreenUpdating As Boolean
Dim bEnableEvents As Boolean
Dim lngCalculation As Long


On Error GoTo errHandler
With Application
    bScreenUpdating = .ScreenUpdating
    bEnableEvents = .EnableEvents
    lngCalculation = .Calculation
    .ScreenUpdating = False
    .EnableEvents = False
    .Calculation = xlCalculationManual
End With


varNumeric = rngNumeric
varText = rngText

pt.EnableDataValueEditing = True
'Setting this to TRUE allow users or this code to temporarily overwrite PivotTable cells in the VALUES area.
'Note that this only 'sticks' until the next time the PivotTable is refreshed, so this code needs to be
' triggerred on every refresh

For Each cell In pt.DataBodyRange.Cells
    With cell
        varResult = Application.Index(varText, Application.Match(.Value2, varNumeric, 0))
        If Not IsError(varResult) Then
            cell.Value2 = varResult
        Else:
            If Not IsMissing(varNoMatch) Then cell.Value2 = varNoMatch
        End If
    End With
Next cell

errHandler:
 If Err.Number > 0 Then
    If gbDebug Then
        Stop: Resume
    Else:
        MsgBox "Whoops, there was an error: Error#" & Err.Number & vbCrLf & Err.Description _
         , vbCritical, "Error", Err.HelpFile, Err.HelpContext
    End If
End If

With Application
    .ScreenUpdating = bScreenUpdating
    .EnableEvents = bEnableEvents
    .Calculation = lngCalculation
End With


End Function

结果如下:在 VALUES 区域中包含文本的数据透视表:

这里的 'conversion' table 告诉代码要为每个数字显示什么:

我已经为它们分配了两个命名范围,这样我的代码就知道在哪里可以找到查找 table:

  • tbl_PivotValues.TextValue
  • tbl_PivotValues.NumericValue

...下面是我触发函数并传入所需参数的方式:

Option Explicit

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

If Target.Name = "GroupView" Then Pivots_TextInValuesArea Target, [tbl_PivotValues.NumericValue], [tbl_PivotValues.TextValue]

End Sub

该代码进入与数据透视表所在的工作表相对应的工作表代码模块中:

您可以使用 MS Power Query Add-in*。透视表没有 vba 很容易。它是免费的,而且对数据转换非常有效。

M代码

 let
    Source = Excel.CurrentWorkbook(){[Name="table1"]}[Content],
    #"Pivot column" = Table.Pivot(Source, List.Distinct(Source[Region]), "Region", "Mytext")
in
    #"Pivot column"

你的输出

´* 来自 MS Office 2016,它作为 Get & Transform 功能完全集成在 Excel 中。

对于未来的读者 - 结合使用两个功能:

功能区 > 数据透视表工具 > 报表布局 > 以表格形式显示

功能区 > 数据透视表工具 > 报表布局 > 重复所有项目标签

行字段将作为垂直重复文本从左到右显示。