使用宏 - 下标超出范围创建数据透视表

时间:2015-12-05 06:35:11

标签: vba excel-vba excel

我正在尝试创建数据透视表宏。为此,我有输入数据,我有一个录制的宏。但是,我收到错误,因为我想在代码的多个区域中使用它。

以下是一些示例数据:

enter image description here

我需要这样的输出:

enter image description here

Sub macro5()
'
' macro5 Macro
'

'
    Range("A2:C16").Select
    Range("C16").Activate
    Sheets.Add
    ActiveWorkbook.Worksheets("sheet2").PivotTables("PivotTable3").PivotCache. _
        CreatePivotTable TableDestination:="Sheet6!R3C1", TableName:="PivotTable5" _
        , DefaultVersion:=xlPivotTableVersion12
    Sheets("Sheet6").Select
    Cells(3, 1).Select
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Item")
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Category")
        .Orientation = xlColumnField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable5").AddDataField ActiveSheet.PivotTables( _
        "PivotTable5").PivotFields("Price"), "Sum of Price", xlSum
End Sub

我在突出显示的部分收到错误。

任何人都可以帮我找出原因吗?

1 个答案:

答案 0 :(得分:1)

只有在Sheet2上已有来自同一数据集的现有数据透视表(称为数据透视表3)时,您的代码才有效。数据透视表共享一个PivotCache,如果存在,Excel将不会创建另一个,但重用现有的。这就是你的宏试图做的事情。

我建议您在文档中录制一个没有数据透视表的宏。这样,pivot-cache-creating-code将出现在录制的宏中。如果您需要多个数据透视表,则可以将上述宏用于下一个数据透视表,但请确保指向您的第一个数据透视表的缓存。

录制宏以插入数据透视表时必须考虑的事项:

请注意,宏录制器记录了一些固定名称(例如工作表名称,数据透视表名称,数据输入区域)。确保这些是正确的,如果没有,请使用变量或其他方式使它们动态化。

以下是创建新数据透视表的示例代码:

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "Sheet2!R1C1:R9C3", Version:=xlPivotTableVersion15).CreatePivotTable _
    TableDestination:="Sheet3!R3C1", TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion15

请注意它与你的不同。

现在关于有问题的部分:

SourceData:="Sheet2!R1C1:R9C3"

如果您希望源数据是动态的,请更改此设置。例如。要使用当前选择,请使用:

SourceData:=Selection

另一个有趣的部分:

TableDestination:="Sheet3!R3C1"

如果您只使用空字符串(“”),它将始终将数据透视表插入新工作表(也将立即激活):

TableDestination:=""

数据透视表的名称不是问题,因为从Excel 2007及更高版本,您可以拥有多个具有相同名称的数据透视表,只要它们位于不同的工作表上即可。如果您想在同一工作表上使用更多数据透视表,则还必须考虑TableName属性。

好的,我可以在很多页面上继续讨论这个问题。我希望这有帮助!如果您有疑问,请询问。