Как обновить несколько сводных таблиц с несколькими источниками данных? - PullRequest
1 голос
/ 18 мая 2019

Здравствуйте, красивые люди!

Я использую Excel 2010 и пытаюсь найти удобный макрос, который обновит все сводные таблицы в книге. Я хочу, чтобы он был универсальным, что означает применимость к ЛЮБОЙ книге, которая содержит сводные таблицы. Под обновлением я не подразумеваю просто обновление сводной таблицы, поскольку данные в наших отчетах переписываются, и все, что остается от исходного исходного диапазона, - это заголовок. Это означает Мне нужно динамически изменить источник данных на новый диапазон.

Пример: У меня есть сводная панель с 8 сводными таблицами на сводной странице. Каждая сводная таблица имеет свой собственный источник данных на своем листе (сводная таблица 1 содержит данные на листе 1, сводная таблица 2 содержит данные на листе 2 и т. Д.)

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

ActiveWorkbook.PivotTables(PivotTable1).ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData, _
        Version:=xlPivotTableVersion15)

Теперь мой мыслительный процесс был таким: Так как заголовок находится в SourceData, мне нужно найти способ получить этот диапазон и просто расширить его до последней строки с обычным lastRow = Cells(Rows.Count, 1).End(xlUp).Row

Я пытался добиться этого с помощью свойства .SourceData, но оно оказалось бесполезным, поскольку свойство .SourceData имеет тип Variant. Поэтому я немного покопался в форумах по Excel и нашел код для преобразования этого в желаемый тип: Application.Evaluate(Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1))

Полагаю, что я правильно реализовал это с помощью некоторой обрезки строк, чтобы получить нужные ссылки, но даже если теоретически это выглядит великолепно (по крайней мере, в моих глазах) Я получаю ошибку времени выполнения (см. Ниже) и теперь я Я в растерянности. Поэтому я обращаюсь к вам, ребята, чтобы узнать, не могли бы вы поделиться своими знаниями или дать совет.

Это текущий код, с которым мне нужна помощь (с пояснениями):

Sub pivot_updator()

Dim lastRow As Long
Dim pt As PivotTable
Dim ws As Worksheet
Dim dataArea As Range
Dim sSheetTrim As String
Dim sRangeTrim As String

For Each ws In ActiveWorkbook.Sheets
    For Each pt In ws.PivotTables
        'evaluate String to get Range after conversion from Variant - recovered from another forum
        Set dataArea = Application.Evaluate(Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1))

        'some trimming to get desired references for lastRow (sheet in which the SourceData are located) and dataArea (starting cell and last column of SourceData)
        sSheetTrim = Left(pt.SourceData, 6)
        sRangeTrim = Left(dataArea.Address, 8)
        lastRow = Sheets(sSheetTrim).Cells(Rows.Count, 1).End(xlUp).Row

        'gluing the starting cell and lastcolumn (sRangeTrim) together with ending cell in last row (lastrow)
        Set dataArea = Range(sRangeTrim & lastRow)

        'test that I am getting correct Range for the pivot SourceData update
        MsgBox dataArea.Address

        'following gives me the Runtime error -2147024809(80070057)
        pt.ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create _
        (SourceType:=xlDatabase, _
        SourceData:=dataArea, _
        Version:=xlPivotTableVersion12)

        'just to be sure the pivot table refreshes after the SourceData is updated
        pt.RefreshTable
    Next pt
Next ws

MsgBox "Pivot Update Done"
End Sub

Запуск этого Sub запрашивает у меня Ошибка времени выполнения -2147024809 (80070057): «Имя поля сводной таблицы недопустимо. Для создания отчета сводной таблицы необходимо использовать данные, организованные в виде списка с помеченными столбцами. Если вы изменяете имя поля сводной таблицы, необходимо ввести новое имя для поля. «

Что нужно сделать, это циклически пройти все сводные таблицы и расширить соответствующие диапазоны источников данных до последней строки.

Так как предполагается, что это универсальный макрос на все времена, вы сможете проверить его самостоятельно на любой книге, содержащей сводную таблицу.

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

1 Ответ

0 голосов
/ 23 мая 2019

Красивые люди,

К счастью, после перерыва и возвращения к этой проблеме с ясной головой, я смог определить проблему.Несмотря на то, что ссылки на ячейки динамического диапазона были установлены правильно, область действия диапазона не была.В dataArea не было никакой информации Sheet, поэтому присутствовала ошибка времени выполнения для неверной сводной таблицы.Вероятно, это был результат Application.Evaluate, в котором отсутствовала ссылка на лист.

Мне пришлось дополнительно добавить код, который обрезал строковый адрес, чтобы он содержал имя листа, на котором были расположены исходные данные сводки.

Пожалуйста, см. Исправленный код ниже:

Sub pivot_updator()

Dim lastRow As Long
Dim pt As PivotTable
Dim ws As Worksheet
Dim dataArea As Range
Dim sSheetTrim As String
Dim sRangeTrim As String
Dim SourceDataSheet As String

Application.ScreenUpdating = False
Application.Calculation = xlManual

For Each ws In ActiveWorkbook.Sheets
    For Each pt In ws.PivotTables
        'evaluate String to get Range after conversion from Variant - recovered from another forum
        SourceDataSheet = Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1)
        Set dataArea = Application.Evaluate(Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1))

        'implemented fix - trim to get desired Sheet name on which pivot source data are located
        sSheetTrim = Split(SourceDataSheet, "!")(0)
        sSheetTrim = Split(SourceDataSheet, "'")(1)
        sSheetTrim = Split(sSheetTrim, "]")(1)

        'some trimming to get desired references for lastRow (sheet in which the SourceData are located) and dataArea (starting cell and last column of SourceData)
        sRangeTrim = Left(dataArea.Address, 8)
        lastRow = Sheets(sSheetTrim).Cells(Rows.Count, 2).End(xlUp).Row

        'gluing the starting cell and lastcolumn (sRangeTrim) together with ending cell in last row (lastrow)
        Set dataArea = Sheets(sSheetTrim).Range(sRangeTrim & lastRow)

        'test that I am getting correct Range for the pivot SourceData update

        'following gives me the Runtime error -2147024809(80070057) // MAYBE the DATA AREA DOES NOT DEFINE SHEET
        pt.ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create _
        (SourceType:=xlDatabase, _
        SourceData:=dataArea, _
        Version:=xlPivotTableVersion12)

        'just to be sure the pivot table refreshes after the SourceData is updated
        pt.RefreshTable
    Next pt
Next ws

Application.ScreenUpdating = True
Application.Calculation = xlAutomatic

MsgBox "Pivot Update Done"
End Sub

Код теперь работает нормально, я посмотрю, будут ли какие-либо ошибки, о которых я не задумывался, и, возможно, обновлю код.

Я хотел бы поблагодарить всех, кто прокомментировал этот вопрос и предложил какое-либо решение, а также всем, кто просмотрел и прочитал его.

Спасибо.

...