【问题标题】:Run-time error 1004 while formatting a pivot table格式化数据透视表时出现运行时错误 1004
【发布时间】:2019-07-27 20:26:48
【问题描述】:

我有一个 Excel 数据透视表,我只想在其上做两件事:(1) 应用经典 PivotTable 布局,以及 (2) 不显示小计。为了帮助我编写代码,我录制了一个宏。运行宏时,我收到“运行时错误'1004':无法获取工作表类的PivotTable 属性。”

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

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 布局,然后删除可能存在的任何小计。

【问题讨论】:

    标签: excel vba pivot-table


    【解决方案1】:

    您的代码地址为ActiveSheet(当前可见的)并且仅在名称为“PivotTable1”的PivotTable 驻留在其上时才有效:

    ActiveSheet.PivotTables("PivotTable1")
    

    要使其更具体或更通用,您可以通过其名称或索引来处理工作表,也可以通过其名称或索引来处理数据透视表,例如。 g.

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

    切换PivotField 的用户定义小计仅在该数据透视字段用作RowFieldColumnField 时才有效,因此我建议明确解决这些问题,并像这样遍历所有这些:

    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
    

    【讨论】:

    • 感谢您的回答,Asger,这解决了我的问题。唯一不能正常工作的行是最后一个 For-Next 命令(它也产生了错误 1004),但这并不重要,因为您建议的其余代码直接进入了重点。问候。
    • 如果您的数据透视表中有多个值字段,Excel 会自动添加一个列字段“值”,该字段必须从所有(其他)列字段的第二个循环中排除。所以我只是加了一个检查:如果一个列字段的Grouplevel报错,那么就是这样一个值字段,然后你不能切换它的小计。
    【解决方案2】:

    您可以使用字段属性.PivotFields("A").Subtotals(1) = True 将小计默认设置为Automatic,而不是使用数组,然后在下一行使用False 将其关闭。

    代码:

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

    More Information Here


    要关闭每个字段的小计:

    For Each fld In ActiveSheet.PivotTables("PivotTable1").PivotFields
    
        fld.Subtotals(1) = True
        fld.Subtotals(1) = False
    
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多