如何使用 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
。
由于 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
【讨论】:
【参考方案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 数据透视表中删除小计的主要内容,如果未能解决你的问题,请参考以下文章
如何向/从具有 VBA 宏计算的 Excel 文件发送和接收信息
如何使用vba从excel中从数据库(varbinary max)中检索pdf文件