Добавить сводную таблицу, чтобы открыть книгу - PullRequest
0 голосов
/ 31 января 2020

Я провел значительное количество исследований о том, как добавить сводную таблицу в другую рабочую книгу, но у меня мало времени.

Мой набор данных

Макрос хранится в ThisWorkbook

Исходные данные для сводной таблицы хранятся в Открытой книге - имя листа "Необработанные данные"

Назначение сводной таблицы требуется для того же Откройте рабочую книгу , но на Имя листа "Сводка заявки"

Предостережение

Этот procedure является частью гораздо более широкого проекта. Таким образом, у меня есть несколько module declarations:

Private wbReconcile As Workbook

Private wsRawData As Worksheet

Private wsSummary As Worksheet

Затем они устанавливаются в разное rnet процедура (в том же модуле) как таковая:

Set wbReconcile = Workbooks.Open(RECON_FILE, False)

Set wsRawData = wbReconcile.Sheets("Raw Data")

Set wsSummary = wbReconcile.Sheets("Claim Summary")

Проблема & Ошибка

Проблема, с которой я столкнулся, заключается в том, что независимо от того, использую ли я variables или печатаю имя рабочей книги, название рабочей таблицы / с и т. Д. c .. Я всегда получаю ошибка в строке Set myPivotTable Сообщение об ошибке: Ошибка времени выполнения '5': неверный вызов процедуры или аргумент.

Мой код

Sub CreatePivotTable()

    Dim myDestinationWorkbook As Workbook
    Set myDestinationWorkbook = Workbooks("Template_Promo Claims Reconciliation.xlsm")
'    Set myDestinationWorkbook = wbReconcile

    Dim mySourceWorksheet As Worksheet
    Set mySourceWorksheet = myDestinationWorkbook.Worksheets("Raw Data")
'    Set mySourceWorksheet = wsRawData
    Dim myDestinationWorksheet As Worksheet
    Set myDestinationWorksheet = myDestinationWorkbook.Worksheets("Claim Summary")
'    Set myDestinationWorksheet = wsSummary

    'obtain address of destination cell range
    Dim myDestinationRange As String
    myDestinationRange = myDestinationWorksheet.Range("A1").Address(ReferenceStyle:=xlR1C1)

    Dim mySourceData As String
    mySourceData = mySourceWorksheet.Range("A1").CurrentRegion.Address(ReferenceStyle:=xlR1C1)

    'create Pivot Table cache and create Pivot Table report based on that cache
    Dim myPivotCache As PivotCache
    Set myPivotCache = _
        myDestinationWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
        SourceData:="[" & myDestinationWorkbook.name & "]" & _
        mySourceWorksheet.name & "!" & _
        mySourceData)

    Dim myPivotTable As PivotTable
    Set myPivotTable = myPivotCache.CreatePivotTable(TableDestination:="[" & _
        myDestinationWorkbook.name & "]" & myDestinationWorksheet.name & "!" & _
        myDestinationRange, TableName:="RawDataPivot")

End Sub

РЕДАКТИРОВАТЬ, ЧТОБЫ ПОКАЗАТЬ, КАК ИСПОЛЬЗУЕТСЯ ОТВЕТ

Sub AnswerPT()

    Dim pc As PivotCache, pt As PivotTable
    Dim wsSrc As Worksheet, wsDest As Worksheet
    Dim rngSrc As Range, rngDest As Range

    Set wsSrc = wsRawData
    Set wsDest = wsSummary   'for convenience here

    Set rngSrc = wsSrc.Range("A1").CurrentRegion  'source data
    Set rngDest = wsDest.Range("A1")    'table location

    Set pc = wsDest.Parent.PivotCaches.Create(SourceType:=xlDatabase, _
                            SourceData:=rngSrc, Version:=6)

    Set pt = pc.CreatePivotTable(TableDestination:=rngDest, _
                          TableName:="PivotTable2", DefaultVersion:=6)

End Sub

1 Ответ

1 голос
/ 31 января 2020

Вы можете использовать диапазоны напрямую, не создавая их «строковую» версию:

Dim pc As PivotCache, pt As PivotTable
Dim wsSrc As Worksheet, wsDest As Worksheet
Dim rngSrc As Range, rngDest As Range

Set wsSrc = ActiveSheet
Set wsDest = ActiveSheet   'for convenience here

Set rngSrc = wsSrc.Range("C5:E14")  'source data
Set rngDest = wsDest.Range("I5")    'table location

Set pc = wsDest.Parent.PivotCaches.Create(SourceType:=xlDatabase, _
                        SourceData:=rngSrc, Version:=6)

Set pt = pc.CreatePivotTable(TableDestination:=rngDest, _
                      TableName:="PivotTable2", DefaultVersion:=6)
...