Pivot в Excel без агрегации, чтобы показать текст, а не цифры?

предположим, у меня есть такая таблица:

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

Как я могу получить pivot, как это в Excel?

Country  North         South
USA      a             b
Brasil   c             d

Если бы "mytext" был числом, я мог бы сделать сводную таблицу: поскольку существует только одна строка на комбинацию страны и региона, min = max = sum = avg, и любая из этих агрегатных функций фактически покажет мне результат, который я хочу.

но что, когда поле, которое я хочу, не числовое? С библиотекой панд Python я могу использовать фрейм данных.стержень() метод даже на нечисловых полях, но я не нашел способа сделать то же самое в Excel. Я мог бы связать число с каждой строкой, сделать сводку в Excel, чтобы показать это число, а затем выполнить поиск, чтобы получить связанный текст, но это кажется довольно запутанным процессом для чего-то, что должно быть действительно проще!

4 ответов


можно использовать 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"

ваш выход enter image description here

* из MS Office 2016 он полностью интегрирован в Excel как Get & Transform.


добавьте MyText как метку строки под меткой страны, затем отобразите сводную таблицу в табличном формате на вкладке дизайн сводной таблицы. Повторите метки элементов для поля метка строки страны.


для будущих читателей-используйте две функции вместе:

Лента > инструменты сводной таблицы > макет отчета > показать в табличной форме

и

Лента > инструменты сводной таблицы > макет отчета > повторить все метки элементов

поля строк будут представлены слева направо в виде вертикально повторяющегося текста.


Это можно сделать, но требует, чтобы VBA временно перезаписал числовое значение "заполнителя" в вашей сводной таблице с некоторым текстом. Чтобы включить это, необходимо установить EnableDataValueEditing = True для сводной таблицы. После обновления выполните поиск числового значения-заполнителя и замените его текстом. Запутанная, да. Обходной путь, да. Но это делает свое дело. Обратите внимание, что это только "прилипает" до следующего обновления сводной таблицы, поэтому этот код должен запускаться на каждом обновить.

вот код, который я использую для этого в одном из моих собственных проектов. Поместите это в стандартный модуль кода:

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

и вот результат: сводная таблица с текстом в области значений:

enter image description here

Вот таблица "преобразование", которая сообщает коду, что отображать для каждого числа:

enter image description here

Я назначил им два именованных диапазона, чтобы мой код знал, где найдите таблицу поиска:

  • tbl_PivotValues.Текст значение
  • 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

этот код входит в модуль кода рабочего листа, который соответствует рабочему листу, где сводная таблица:

enter image description here