excel - 无法通过 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:我可以从同一数据源手动创建数据透视表。
解决方案
SourceData:=PTRange.Address
将为我们提供不带工作表名称的单元格地址,例如$C$7:$G$17
. 这不适用于 PT。
SourceData
需要带有工作表名称的范围引用,例如
因此,应该是
SourceData:= PTRange.Parent.Name & "!" & PTRange.Address
。但是,如果您的工作表名称包含空格,那么它应该是SourceData:= "'" & PTRange.Parent.Name & "'!" & PTRange.Address
.
由于您的数据包含在 named-rangeTable1
中,因此使用名称SourceData
会容易得多。