【问题标题】:Pivot Table-VBA Error数据透视表-VBA 错误
【发布时间】:2013-09-02 15:41:20
【问题描述】:

我正在使用以下代码:

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:“Set pt=" 行发生错误。
  • 我怀疑您的源范围发生了问​​题,可能是列标题(或整个列?)被意外删除了?

标签: excel vba


【解决方案1】:

尝试使用ListObject(“表”)而不是Range 作为数据源;这些总是是数据透视表的有效数据源 - 请参阅 this SO question - 那里的 OP 没有遇到与您相同的问题,但我相信同样的解决方案也适用。

表格之所以总是有效的来源是因为它们总是有有效的标题,而且它们总是至少有 1 行数据。

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

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

对于使用有效数据源的缓存,完全按照您对Set pt 所做的操作应该不会有问题:

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

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

【讨论】:

  • 虽然是一个很好的建议,但这并不是对这个特定问题的特定答案。这将是一个很好的评论。
  • 感谢retailcoder!我会检查你的建议。我见过很多人面临这个问题。但该解决方案不适用于我。
  • 是的,当使用 Range 作为数据源时,很多令人讨厌的小事情都会出错 :) -- 感谢您的勾选!
  • 也得到了我的 +1。对更好方法的很好解释。
  • @B.ClayShannon 您需要 .Add 到工作表的 .ListObjects 集合。具体是如何完成的,这个网站上肯定有一些问答。或者您可以通过选择表格(范围)中的任何单元格来手动执行此操作,然后从主页功能区选项卡中单击“格式为表格”。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 2018-11-06
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多