数据透视表-VBA错误

我使用下面的代码:

Sub MakeAPivotTable() Dim pt As PivotTable Dim cacheOfpt1 As PivotCache 'This is the Source Data Dim pf As PivotField Dim pi As PivotItem Dim LastCol As Long Dim LastRow As Long Dim PRange As Range LastCol = Sheets("Sheet2").Range("A1").SpecialCells(xlCellTypeLastCell).Column LastRow = Sheets("Sheet2").Range("A1").SpecialCells(xlCellTypeLastCell).Row Set PRange1 = Sheets("Sheet2").Cells(1, 1).Resize(LastRow, LastCol) On Error GoTo err_add_Y_next_row Sheets("Sheet3").Select ActiveSheet.PivotTables("PivotTable1").TableRange2.Clear 'Delete any Pivot Table 'set the cache of PT Sheets("Sheet2").Select Set cacheOfpt1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, PRange1) 'create the pt Sheets("Sheet3").Select Set pt = ActiveSheet.PivotTables.Add(cacheOfpt1, Range("a1"), "PivotTable1") 'put the Fields in With pt 'add the Fields .PivotFields("CAMPAIGN").Orientation = xlRowField '.PivotFields("TAG1").Orientation = xlRowField '.PivotFields("TAG2").Orientation = xlRowField '.PivotFields("TAG3").Orientation = xlRowField .PivotFields("CIRN").Orientation = xlColumnField .PivotFields("RUN").Orientation = xlPageField 'Column Filter .PivotFields("TVSN").Orientation = xlDataField 'Value Field 'set the number format .DataBodyRange.NumberFormat = "#,##0.00" 'go to classic View .RowAxisLayout xlTabularRow End With err_add_Y_next_row: MsgBox Err.Number & Err.Description, _ vbExclamation, "VBAtools.pl" End Sub 

但是当我运行代码的时候,我得到了错误“数据透视表字段名称是无效的。要创build一个数据透视表报表,你必须使用被组织成带标签列的列表的数据,如果你改变了名字数据透视表字段,您必须为该字段键入一个新的名称。“

这段代码运行良好。 但突然间我开始出现这个错误。

任何人都可以帮我find原因。

谢谢。

尝试使用ListObject (“Table”)而不是数据源的Range ; 这些始终是一个数据透视表的有效数据源 – 看到这个问题 – OP没有像你一样的问题,但我相信同样的解决scheme适用。

为什么总是有效的来源是因为它们总是有有效的标题,并且它们总是至less有一行数据。

一旦你把你的范围变成了一个表格(并称之为“Table1”),你可以像这样使用它:

 Set cacheOfPt1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, "Table1") 

对于使用有效数据源的caching,执行Set pt应该没有问题:

 Set pt = ActiveSheet.PivotTables.Add(cacheOfpt1, Range("a1"), "PivotTable1") 

另外,通过这种设置,您可能需要重新考虑每次从头开始完全重build数据透视表的需求; 您可以简单地向/从“Table1”添加/删除数据,然后刷新数据透视表 – 它将自动更新以反映“Table1”的内容。