Здравствуйте, красивые люди!
Я использую 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. Спасибо, что потратили время на изучение моей проблемы и вложили в нее свою красоту.