Excel VBA将数据透视表数据复制到另一张图纸中+;更改标题

Excel VBA将数据透视表数据复制到另一张图纸中+;更改标题,excel,vba,pivot-table,Excel,Vba,Pivot Table,我正在尝试将数据以普通格式复制到另一个工作表中,并对其进行进一步转换 虽然我可以创建透视表,但每当我尝试将其复制到另一个工作表中时,新工作表都是空的。想知道是否有专家能指出我做错了什么。以下是我的代码供参考: Dim PSheet As Worksheet Dim DSheet As Worksheet Dim CSheet As Worksheet Dim PCache As PivotCache Dim PTable As PivotTable Dim PRange As Range Dim

我正在尝试将数据以普通格式复制到另一个工作表中,并对其进行进一步转换

虽然我可以创建透视表,但每当我尝试将其复制到另一个工作表中时,新工作表都是空的。想知道是否有专家能指出我做错了什么。以下是我的代码供参考:

Dim PSheet As Worksheet
Dim DSheet As Worksheet
Dim CSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PRange As Range
Dim LastRow As Long
Dim LastCol As Long

'*****************************************************
'  Declare variables
'*****************************************************
On Error Resume Next
Application.DisplayAlerts = False
Worksheets("Pivot_Table").Delete
Worksheets("Cleaned_Data").Delete
Worksheets("RAW_DATA").Activate
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "Pivot_Table"
Application.DisplayAlerts = True
Set PSheet = Worksheets("Pivot_Table")
Set DSheet = Worksheets("RAW_DATA")

'*****************************************************
'  Define data range for pivot
'*****************************************************

LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set PivotRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)

'*****************************************************
'  Create pivot cache
'*****************************************************
Set PivotCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PivotRange).CreatePivotTable(TableDestination:=PSheet.Cells(1, 1), TableName:="UserPivotTable")

'*****************************************************
'  Insert blank pivot
'*****************************************************
Set PTable = PivotCache.CreatePivotTable(TableDestination:=PSheet.Cells(1, 1), TableName:="UserPivotTable")

'*****************************************************
'  Insert row fields
'*****************************************************
With ActiveSheet.PivotTables("UserPivotTable").PivotFields("userid")
    .Orientation = xlRowField
    .Position = 1
End With

'*****************************************************
'  Insert data field
'*****************************************************
With ActiveSheet.PivotTables("UserPivotTable").PivotFields("QTY")
    .Orientation = xlDataField
    .Position = 1
    .Function = xlSum
    '.NumberFormat = "#,##0"
    '.Name = "Revenue "
End With

'*****************************************************
'  Copy data into another sheet for cleaning
'*****************************************************
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = "Cleaned_Data"
Application.DisplayAlerts = True
Set CSheet = Worksheets("Cleaned_Data")

PTable.TableRange2.Copy
CSheet.Range("A1").PasteSpecial xlPasteValues

此外,将数据复制到新工作表后,我应该如何自定义标题?

为了保持一致性,请将缺少的变量添加到dim部分:

Dim pivotRange As Range
Dim pivotCache As pivotCache
并将最后一行,即复制行更改为:

PSheet.PivotTables("UserPivotTable").TableRange2.Copy

为保持一致性,请将缺少的变量添加到dim部分:

Dim pivotRange As Range
Dim pivotCache As pivotCache
并将最后一行,即复制行更改为:

PSheet.PivotTables("UserPivotTable").TableRange2.Copy

如果调试代码,您将看到,
PivotCache
Nothing

您的代码行
设置数据透视缓存=
太长。
由于您只需要引用新的
数据透视缓存
,请使用以下方法:

Set PivotCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PivotRange)
进一步提示:
不应将VBA内部名称用作变量名称。

请参阅关于进一步的格式。

如果调试代码,您将看到,
数据透视缓存

您的代码行
设置数据透视缓存=
太长。
由于您只需要引用新的
数据透视缓存
,请使用以下方法:

Set PivotCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PivotRange)
进一步提示:
不应将VBA内部名称用作变量名称。

请参阅关于进一步的格式设置。

谢谢,它似乎可以工作,但为什么我不能使用PTable作为引用对象进行复制呢?我有一种可怕的感觉,尽管我记得文档中说数据透视表是从createPivotTable命令返回的,但实际上什么都没有-因此PTable变量仍然为空。谢谢,这似乎有效,但为什么我不能使用PTable作为引用对象进行复制呢?我有一种可怕的感觉,尽管我记得文档中说数据透视表是从createPivotTable命令返回的,但实际上什么都没有,所以PTable变量仍然为空。请注意,另一个答案和他的“可怕感觉”这是误导。每个模块上方的
选项Explicit
和每个变量的
Dim
都是良好的做法,但也定义了数据透视表的引用。当然,您仍然应该使用引用
pTable
来处理新生成的数据透视表(而不是
PSheet.PivotTables(“用户数据透视表”)
)。只要缩短a。M要知道另一个答案和他的“可怕的感觉”是误导性的。每个模块上方的
选项Explicit
和每个变量的
Dim
都是良好的做法,但也定义了数据透视表的引用。当然,您仍然应该使用引用
pTable
来处理新生成的数据透视表(而不是
PSheet.PivotTables(“用户数据透视表”)
)。只要缩短a。M代码行,一切正常。