无法通过 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
会容易得多。
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
会容易得多。