показать детали для каждого элемента сводки на новом листе и изменить его имя - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь:

  1. Создать развернутую таблицу для каждой видимой компании в сводной таблице на новом листе.
  2. Переименовать лист с названием компании.

Кажется, что у меня работает код, пока я не применю фильтр к сводной таблице.

Sub Test1()

    Dim pField As PivotField
    Dim pItem As PivotItem

    Set pField = Sheets("PivotTable").PivotTables(1).PivotFields("Company")

    Application.ScreenUpdating = False

    For Each pItem In pField.PivotItems
    If pItem.Visible Then
        pItem.DataRange.ShowDetail = True
        ActiveSheet.Name = pItem.Name
        End If
    Next pItem

    Application.ScreenUpdating = True

End Sub

1 Ответ

0 голосов
/ 31 марта 2019

Фон на PivotItem.Visible

Если вы фильтруете PivotTable, то некоторые из ваших Rowfields или ColumnFields показывают меньше PivotItems.

К сожалению, каждый соответствующий PivotField.PivotItem по-прежнему возвращается как Visible, даже если вы его не видите.Также PivotField.VisibleItems.Count не уменьшается.

Адресация к "действительно" видимым PivotItems

Фильтрация PivotTable изменяет видимые DataRange PivotField, поэтомуВы можете зациклить его ячейки и использовать значение ячейки для идентификации каждого видимого PivotItem:

Dim pItemCell As Range
For Each pItemCell In pField.DataRange
    If pItemCell.Value <> "(blank)" Then
        Set pItem = pField.PivotItems(pItemCell.Value)
        pItem.DataRange.ShowDetail = True
        ActiveSheet.Name = pItem.Name
    End If
Next pItemCell

Вы также можете зациклить каждое PivotRowAxis.PivotLines().PivotLineCells().PivotItem.
Пожалуйста, посмотрите мой ответ здесь: https://stackoverflow.com/a/55444457/10908769

Получение сведений о столбце GrandTotals

Dim pTable As PivotTable
Dim pField As PivotField
Dim i As Long

Set pField = Sheets("PivotTable").PivotTables(1).PivotFields("Company")
Set pTable = pField.Parent

If pTable.RowGrand = True Then
    For i = 1 To pField.DataRange.Cells.Count
        pTable.DataBodyRange.Cells(i, pTable.DataBodyRange.Columns.Count).ShowDetail = True
        ActiveSheet.Name = pField.DataRange.Cells(i).Value
    Next i
End If

Подсказка для ActiveSheet.Name

Обратите внимание, чтоСуществуют ограничения для переименования листа: https://stackoverflow.com/a/54620175/10908769

...