如何使用VBA从具有多个数据字段的Excel数据透视表中删除小计

时间:2019-04-18 20:10:14

标签: excel vba pivot-table subtotal

如果数据透视表具有多个数据字段,则无法从数据透视表中删除所有小计。

无论它有多少行或列标签,只要只有一个数据字段,它就会起作用。这是我的代码:

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: 无法设置数据透视类的小计属性

2 个答案:

答案 0 :(得分:1)

您需要遍历每个PivotField并更新每个.Subtotals属性。有十二个。由于您不希望有任何小计,请将它们全部设置为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

答案 1 :(得分:0)

PivotField.Subtotals的{​​{3}}说明中描述了答案。

如果要关闭所有小计类型,可以将Automatic小计设置为True(将所有其他类型都关闭)并设置为{{1} },或者使用给定的数组符号将所有12种类型都设置为False

小计只能为非数据字段定义。因此,您不能遍历所有False,而应遍历PivotFields(或RowFields)。这样,您也可以省略ColumnFields

由于On Error Resume NextColumnGrand在每个数据透视表中定义一次,因此我将其放置在循环之前。

RowGrand