将Pivot Cache放在一个工作簿中,将Pivot表放在另一个工作簿中

时间:2017-06-20 04:45:16

标签: excel-vba pivot-table vba excel

我已在工作表'sourceBook.xlsx'中创建了一个Pivot Cache,位于工作表'sourceSheet'中。我试图在表'destinSheet'中的不同工作簿'destinBook.xlsx'中创建一个数据透视表。

Dim pCache As PivotCache
Dim pTable As PivotTable
Dim pRange As Range

Module2.hc_book.Activate
Set pRange = ActiveSheet.Range(hc_pidCol & "1:" & hc_pidCol & hc_lastRow)

Set pCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, pRange)
Module2.mt_book.Activate
Set tempSheet = Worksheets.Add
tempSheet.Select
Set pTable = ActiveSheet.PivotTables.Add(pCache, Range("A1"), "MyPivotTable")

代码在最后一行给出了错误 - “无效的过程调用或参数”,我正在设置pTable。该代码适用于同一工作表中的目标。所以,请让我知道我在哪里犯错误。

1 个答案:

答案 0 :(得分:1)

PivotCachePivotTable报告的内存缓存。首先,PivotTable需要此内存缓存。

您可以从当前工作簿中的数据创建PivotCache,但它必须是新工作簿中数据透视表的一部分,才能创建基于它的数据透视表。

由于PivotCache在新的Workbook.PivotCaches中不可用,因此您无法在该工作簿中创建数据透视表,这就是您的代码无法运行的原因。

运行良好:

Sub test()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim pRange As Range
    Dim pc As PivotCache
    Dim pt As PivotTable

    Set wb = Workbooks.Add
    Set ws = wb.Worksheets(1)

    Set pRange = ThisWorkbook.Sheets("Sheet1").Range("A1:C3")

    Set pc = wb.PivotCaches.Create(xlDatabase, pRange)
    Set pt = ws.PivotTables.Add(pc, Range("F2"), "MyPivotTable")

End Sub

这不起作用:

Sub test()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim pRange as Range
    Dim pc As PivotCache
    Dim pt As PivotTable

    Set wb = Workbooks.Add
    Set ws = wb.Worksheets(1)

    Set pRange = ThisWorkbook.Sheets("Sheet1").Range("A1:C3")

    Set pc = ThisWorkbook.PivotCaches.Create(xlDatabase, pRange) 'Cache in ThisWorkbook
    Set pt = ws.PivotTables.Add(pc, Range("F2"), "MyPivotTable") 'Cache unavailable, error 5 - Invalid Procedure Call or Argument. 

End Sub

此错误的无效参数是pc对象。

简而言之:PivotCache对象需要成为您要创建PivotCaches

Workbook PivotTable集合的一部分

编辑:只是为了澄清:PivotCache是一个内存对象。它与您从中获取数据的源无关。无论您选择什么,此源都可以是您的第一个工作簿中的范围,或SQL查询的结果,或CSV文件。

编辑2:将pivotCache“复制”到新工作簿的一个非常基本的实现是:

Sub CopyPivotCache()
    Dim wb As Workbook
    Dim InitialPivotCache As PivotCache
    Dim CopyPivotCache As PivotCache

    Set wb = Workbooks.Add
    Set InitialPivotCache = ThisWorkbook.PivotCaches(1)
    Set CopyPivotCache = wb.PivotCaches.Create(InitialPivotCache.SourceType, InitialPivotCache.SourceData)
End Sub