数据透视表-VBA错误

3

我正在使用以下代码:

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

但是当我运行代码时,出现了错误:“数据透视表字段名称无效。要创建数据透视表报告,您必须使用以标记列组织的列表数据。如果要更改数据透视表字段的名称,则必须键入新名称。”

这段代码之前一直能正常运行,但突然间出现了这个错误。

请问有人能帮我找出原因吗?

谢谢。


你检查了数据透视表的名称吗? :-) - Makah
错误发生在哪一行? - Doug Glancy
@Makah:是的,我已经检查了数据透视表的名称。 - Beta
@Doug:错误出现在“Set pt =”行。 - Beta
我怀疑你的源范围出了问题,可能是某个列标题(或整个列?)被意外删除了? - Mathieu Guindon
显示剩余2条评论
1个回答

2
尝试使用ListObject(“表格”)而不是Range作为数据源;这些始终是数据透视表的有效数据源-请参见此SO问题-那里的OP没有遇到与您相同的问题,但我认为相同的解决方案适用。
之所以表格始终是有效来源,是因为它们始终具有有效标题,并且始终至少有1行数据。
将范围转换为表格后(并将其称为“Table1”),您可以像这样使用它:
Set cacheOfPt1 = ActiveWorkbook.PivotCaches.Create(xlDatabase, "Table1")

使用有效数据源的缓存,对于您正在执行的Set pt操作不应该存在任何问题:

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

另外,使用这种设置时,您可能需要重新考虑每次完全重建数据透视表的必要性;您可以简单地向“Table1”添加/删除数据,然后刷新您的数据透视表 - 它将自动更新以反映“Table1”的内容。


虽然这是一个很好的建议,但它并不是针对这个具体问题的具体答案。它可以作为一个很好的评论。 - Doug Glancy
谢谢retailcoder!我会检查你的建议。我看到很多人都遇到了这个问题。但是解决方案对我不适用。 - Beta
是的,当使用“范围”作为数据源时,很多麻烦的小问题可能会出现 :) -- 感谢您的勾选! - Mathieu Guindon
1
我也点了个赞。很好的解释,提出了更好的方法。 - Doug Glancy
1
@B.ClayShannon 你需要将其添加到工作表的.ListObjects集合中。具体如何完成这一点,在本站上肯定有很多问答。或者,您可以手动选择表格(范围)中的任何单元格,并从主页功能区选项卡中单击“格式为表格”。 - Mathieu Guindon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接