Excel 透视表VBA错误

Excel 透视表VBA错误,excel,vba,Excel,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 LastCo

我正在使用以下代码:

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
但是,当我运行代码时,会出现错误“数据透视表字段名无效。若要创建数据透视表,必须使用以带标签列的列表形式组织的数据,如果要更改数据透视表字段的名称,则必须为字段键入新名称。”

这段代码运行得很好。但突然我开始犯这个错误

谁能帮我找到原因吗


谢谢。

尝试使用
列表对象
(“表”)而不是数据源的
范围;这些始终是数据透视表的有效数据源-请参阅-OP那里没有与您相同的问题,但我相信同样的解决方案适用

表始终是有效源的原因是,它们始终具有有效的标题,并且始终至少有一行数据

一旦您将范围转换为一个表(并称之为“Table1”),您就可以这样使用它:

Set cacheOfPt1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, "Table1")
对于使用有效数据源的缓存,完全按照您对
设置pt
所做的操作应该不会有问题:

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

此外,使用此设置,您可能需要重新考虑每次从头开始完全重建透视表的需要;您只需在“表1”中添加/删除数据,然后刷新数据透视表-数据透视表将自动更新以反映“表1”的内容。

是否检查数据透视表名称?:-)错误发生在哪一行?@Makah:是的,我检查了数据透视表的名称。@Doug:错误发生在“Set pt=“line”上。我怀疑您的源区域发生了什么事情,可能是一个列标题(或整个列?)被意外删除了?虽然这是一个很好的建议,但并不是对这个问题的具体回答。这将是一个很好的评论。谢谢retailcoder!我会检查你的建议。我见过很多人面临这个问题。但是这个解决方案不适用于我。是的,当使用
范围
作为数据源时,很多烦人的小事情可能会出错:)--谢谢你的提示!我也得到了+1。很好地解释了一种更好的方法。@B.ClayShannon您需要
。将
添加到工作表的
.ListObjects
集合中。具体如何做到这一点,当然有一些问答在这个网站上。或者,您可以通过选择表格(范围)中的任何单元格,并从“主功能区”选项卡中单击“格式为表格”手动执行此操作。