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

Posted

技术标签:

【中文标题】如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计【英文标题】:How to remove subtotal from a excel pivot-table with mutiple data fields useing vba 【发布时间】:2019-04-18 20:10:13 【问题描述】:

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

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

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: 不能设置透视域类的小计属性

【问题讨论】:

我的方法是录制一个宏,看看它是什么样子 另外,最后不需要将你的 3 个变量设置为 Nothing。这是多余的,将在End Sub 完成 @urdearboy 对于一个或多个xlDataField,录制的宏是相同的。结束这是唯一成功的代码(一个xlDataField)到一个运行时错误1004(两个或更多xlDataField)。 【参考方案1】:

答案在Microsoft's对PivotField.Subtotals的解释中描述。

如果您想关闭所有小计类型,您可以将Automatic小计设置为True(关闭所有其他类型)并再次设置为False,或者您设置使用给定的数组表示法将所有 12 种类型添加到 False

只能为非数据字段定义小计。所以你不能遍历所有PivotFields,而是RowFields(或ColumnFields)。这样你也可以省略On Error Resume Next

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

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

【讨论】:

【参考方案2】:

您需要遍历每个 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

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。

以上是关于如何使用 vba 从具有多个数据字段的 excel 数据透视表中删除小计的主要内容,如果未能解决你的问题,请参考以下文章

将特定 Excel 数据从多个字段导出到 Word

如何向/从具有 VBA 宏计算的 Excel 文件发送和接收信息

如何使用vba从excel中从数据库(varbinary max)中检索pdf文件

具有多个标准排名的 Excel VBA 动态数据验证下拉列表

Access VBA:导入多个文件时添加“文件名”字段

如何使用 Excel VBA 将特定行从多个工作表复制到另一个工作表?