首页 > 解决方案 > 无法通过 VBA 创建数据透视表,但我可以从同一数据源手动创建数据透视表

问题描述

    Sub CreatePivot()
      Dim NewSheet As Worksheet
      Dim PTCache As PivotCache
      Dim PT As PivotTable
      Dim PTRange As Range
      Dim FinalRow As Long
      Dim FinalCol As Long
    
       Set NewSheet = Workbooks("東京威力_樞紐分 
       析.xlsm").Sheets.Add(Before:=Workbooks("東京威力_樞紐分 
        析.xlsm").Worksheets(1))
       NewSheet.Name = "Summary"
        
       For Each PT In NewSheet.PivotTables
         PT.TableRange2.Clear
       Next PT
        
       Set PTRange = getTable("Table1").Range
    
      'Create PivotCaches
       Set PTCache = Workbooks("東京威力_樞紐分
       析.xlsm").PivotCaches.Create(SourceType:=xlDatabase, 
       SourceData:=PTRange.Address)
        
    
      'Create PivotTable
       Set PT = 
       PTCache.CreatePivotTable(TableDestination:=NewSheet.Cells(2, 
       2),tableName:="PivotTable1")
        
       'ManualUpdate On
       PT.ManualUpdate = True
    
       PT.AddFields RowFields:=Array("Recharge BU", "Main Category"), 
       ColumnFields:="Recharge To"
    
       With PT.PivotFields("Hours")
        .Orientation = xlDataField
        .Function = xlSum
        .Position = 1
        .NumberFormat = "#,##0.00"
        .Name = "Total - Hours"
       End With
    
      'Calcu PivotTable
      PT.ManualUpdate = False
      PT.ManualUpdate = True

    End Sub
-------------------------------------------------------------------------
     Function getTable(tableName As String) As ListObject
        Dim FinalRow As Long
    
        With Workbooks("東京威力_樞紐分析.xlsm").Worksheets("原始資料")
          On Error GoTo ErrorHandler
            FinalRow = .Cells(Rows.Count, 1).End(xlUp).row
            Set getTable = .ListObjects(tableName)
        End With
     Exit Function
     
     ErrorHandler:
        Debug.Print Err.Number; ":" & Err.Description
     
        If getTable Is Nothing Then
        Workbooks("東京威力_樞紐分析.xlsm").Worksheets("原始資料").ListObjects.Add(xlSrcRange, 
        Workbooks("東京威力_樞紐分析.xlsm").Worksheets("原始資料").Range("A1:AK" & FinalRow), , xlYes).Name = "Table1"

        Set getTable = Worksheets("原始資料").ListObjects(tableName)
     End If
     Resume Next

    End Function

嗨,伙计们,代码的目的是创建数据透视表。但是我收到错误消息『数据透视表字段名称无效。要创建数据透视表,您必须使用组织为带有标签列的列表的数据。如果要更改数据透视表字段的名称,则必须在我创建数据透视表时为该字段键入一个新名称。(在行==> PTCache.CreatePivotTable)

什么可能出错?谢谢

PS:我可以从同一数据源手动创建数据透视表。

标签: excelvbapivot-table

解决方案


SourceData:=PTRange.Address将为我们提供不带工作表名称的单元格地址,例如$C$7:$G$17. 这不适用于 PT。

SourceData需要带有工作表名称的范围引用,例如

在此处输入图像描述

因此,应该是 SourceData:= PTRange.Parent.Name & "!" & PTRange.Address。但是,如果您的工作表名称包含空格,那么它应该是SourceData:= "'" & PTRange.Parent.Name & "'!" & PTRange.Address.

由于您的数据包含在 named-rangeTable1中,因此使用名称SourceData会容易得多。

在此处输入图像描述


推荐阅读