无法通过 VBA 创建数据透视表 table 但我可以从同一数据源手动创建数据透视表 table

Can not create pivot table by VBA but I can manually create pivot table from same data source

    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

大家好,代码的目的是创建枢轴table。 但我收到错误消息 『PivotTable 字段名称无效。要创建 PivotTable 报告,您必须使用组织为带有标签列的列表的数据。如果您要更改 PivotTable 字段的名称,您必须在我创建 PivotTable 时为该字段键入一个新名称』。 (在行==> PTCache.CreatePivotTable)

可能会出什么问题?谢谢

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

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

SourceData 需要使用 sheet 名称的范围引用,例如

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

由于您的数据包含在命名范围 Table1 中,因此使用名称作为 SourceData 会容易得多。