Как удалить промежуточный итог из сводной таблицы Excel с несколькими полями данных, используя vba - PullRequest
2 голосов
/ 18 апреля 2019

Я не могу удалить все промежуточные итоги из сводной таблицы, если в ней более одного поля данных.

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

Option Explicit
Private Sub pivot_table()

    Dim wkb         As Workbook
    Dim sht         As Worksheet
    Dim sht2        As Worksheet
    Dim pvtcch      As PivotCache
    Dim pvttbl      As PivotTable
    Dim pvtrange    As Range
    Dim pvtfield    As PivotField
    '-------------------------------------------------------------------------
    Set wrb = ThisWorkbook
    Set sht = wkb.Sheets(Plan1)

    Set sht2 = wkb.Sheets.Add(After:=sht)
    sht2.Name = "PVTBL"
    With sht
        Set pvtrange = .Range("A1").CurrentRegion
            .ListObjects.Add(xlSrcRange, pvtrange, , xlYes).Name = "sourcepvt"
    End With

    Set pvtcch = wrb.PivotCaches.Create(SourceType:=xlDatabase, _
 SourceData:="sourcepvt")

    Set pvttbl = sht2.PivotTables.Add(PivotCache:=pvtcch, _
 TableDestination:=sht2.Range("A3"), TableName:="Report")

    With pivottbl
        'code to set the row and columns labels and datafields
        .RowAxisLayout xlTabularRow
        .RepeatAllLabels xlRepeatLabels
        On Error Resume Next
        For Each campos In .PivotFields
            campos.Subtotals(1) = False
            .ColumnGrand = False
            .RowGrand = False
        Next campos
    End With
    Set wrb = Nothing
    Set sht = Nothing
    Set sht2 = Nothing
End Sub

Когда я пытаюсь использовать код, я получаю сообщение об ошибке во время выполнения ошибки 1004: Невозможно установить итоговое свойство класса Pivotfield

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Ответ описан в объяснении от Microsoft PivotField.Subtotals.

Если вы хотите отключить все промежуточные итоги, вы можете либо установить Automatic промежуточные итоги равны True (отключает все остальные типы) и снова False, или вы устанавливаете все 12 типов на False с заданной нотацией массива.

Промежуточные итоги могут быть определены только дляполя данных.Таким образом, вы не должны перебирать все PivotFields, а RowFields (или ColumnFields).Этим вы также можете опустить On Error Resume Next.

Поскольку ColumnGrand и RowGrand определены один раз для поворотной таблицы, я поместил его перед циклом.

With pvttbl
    .RowAxisLayout xlTabularRow
    .RepeatAllLabels xlRepeatLabels
    ' defined once per pivottable:
    .ColumnGrand = False
    .RowGrand = False
    ' use RowFields only:
    For Each campos In .RowFields
        ' either this:
        campos.Subtotals(1) = True   ' Automatic on (= all other off)
        campos.Subtotals(1) = False  ' Automatic also off

        ' or that (all 12 off):
        'campos.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
    Next campos
End With
1 голос
/ 18 апреля 2019

Вам нужно будет пройти через все PivotField и обновить каждое свойство .Subtotals.Их 12Поскольку вам не нужны никакие промежуточные итоги, установите их все на False.Вам нужно будет игнорировать ошибки, чтобы цикл не останавливался.

For Each pvtfield In pivottbl.PivotFields
    'Disable subtotals for all fields
    On Error Resume Next
    pvtfield.Subtotals = Array(False, False, False, False, False, False, _
        False, False, False, False, False, False)
    On Error GoTo 0
Next pvtfield
...