数据透视表-VBA错误

时间:2013-09-02 15:41:21

标签: 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


    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

但是当我运行代码时,我收到错误“数据透视表字段名称无效。要创建数据透视表报告,您必须使用组织为带有标记列的列表的数据,如果您是更改数据透视表字段的名称,您必须为该字段键入新名称。“

此代码运行正常。但突然间我开始收到这个错误。

任何人都可以帮我找到原因。

谢谢。

1 个答案:

答案 0 :(得分:2)

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

tables 始终是有效来源的原因是因为它们始终具有有效的标头,并且它们始终至少有一行数据。

将范围转换为表格(并称之为“Table1”)之后,您可以像这样使用它:

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

如果缓存使用的是有效的数据源,那么完全按照Set pt执行操作应该没有问题:

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

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