我有一个Excel数据透视表,我只想做两件事:(1)应用Classic PivotTable布局,和(2)不显示小计。为了帮助我编写代码,我记录了一个宏。运行宏时,出现“运行时错误'1004':无法获取Worksheet类的PivotTable属性”。

数据透视表是手动创建的。然后,我切换到“数据透视”并尝试运行代码。

With ActiveSheet.PivotTables("PivotTable1")
        .InGridDropZones = True
        .RowAxisLayout xlTabularRow
    End With
    ActiveSheet.PivotTables("PivotTable1").PivotFields( _
        "A" _
        ).Subtotals = Array(False, False, False, False, False, False, False, False, False, False _
        , False, False)
    ActiveSheet.PivotTables("PivotTable1").PivotFields("B").Subtotals _
        = Array(False, False, False, False, False, False, False, False, False, False, False, False _
        )


我的期望是该代码将应用Classic PivotTable布局,然后删除可能存在的任何小计。

最佳答案

您的代码处理ActiveSheet(当前可见的代码)并且仅在名称为“ PivotTable1”的PivotTable驻留在其上时起作用:

ActiveSheet.PivotTables("PivotTable1")


为了使其更具体或更笼统,您可以通过工作表的名称或索引,也可以通过数据透视表的名称或索引,例如。 G。

ActiveSheet.PivotTables(1)
ActiveWorkbook.Sheets(3).PivotTables("PivotTable1")
ActiveWorkbook.Sheets("My Sheet Name").PivotTables(1)




如果该枢轴字段用作PivotFieldRowField,则仅切换用户定义的ColumnField小计有效,因此我建议明确地解决这些小计,并像这样遍历所有这些:

Private Sub SwitchAllSubtotalsOnOrOff()
    Dim pt As PivotTable
    Dim pf As PivotField

    Set pt = ActiveSheet.PivotTables(1)
    With pt
        .InGridDropZones = True
        .RowAxisLayout xlTabularRow

        For Each pf In .RowFields
            'pf.Subtotals(1) = True   ' automatic on (= all other off)
            'pf.Subtotals(1) = False  ' automatic also off

            ' all 11 userdefined on (sum, count, average, max, min, product, count nums, stdev, stdevp, var, varp)
            'pf.Subtotals = Array(False, True, True, True, True, True, True, True, True, True, True, True)

            ' all 12 off (= none)
            pf.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
        Next pf

        For Each pf In .ColumnFields
            If Not IsError(pf.GroupLevel) Then
                pf.Subtotals = Array(False, False, False, False, False, False, False, False, False, False, False, False)
            End If
        Next pf

    End With
End Sub

09-28 06:33