Недавно я искал способы совместного использования одного и того же сводного кэша среди нескольких сводных таблиц, поскольку все они используют один и тот же источник данных.Это помогает существенно уменьшить размер файла Excel, поскольку было бы неэффективно создавать новый сводный кэш с теми же данными для каждой сводной таблицы.
Одним из предоставленных мне решений было использование статической переменной, которая позволяет создать единый сводный кеш, который может совместно использоваться различными подпрограммами.Вот как это делается.
'creates and returns a shared pivotcache object
Function GetPivotCache(pRange As Range) As PivotCache
Static pc As PivotCache 'static variables retain their value between calls
If pc Is Nothing Then 'create if not yet created
Set pc = ActiveWorkbook.PivotCaches.Create _
(SourceType:=xlDatabase, SourceData:=pRange)
End If
Set GetPivotCache = pc
End Function
Эта функция используется для создания сводного кэша общего ресурса среди подпрограмм.При создании сводной таблицы я вызываю эту функцию, чтобы проверить, был ли уже создан сводный кэш.Если это так, он не создаст новую копию сводного кэша и вернет ту, которая уже сохранена в статической переменной.
Если кому-то интересно, как я использую его при создании сводной таблицы, я предоставлю еще немного кода, чтобы лучше понять, как он используется.
Sub pivottable1()
Dim PSheet As Worksheet, DSheet As Worksheet
Dim PCache As PivotCache
Dim PTable As PivotTable
Dim PField As PivotField
Dim pRange As Range
Dim LastRow As Long
Dim LastCol As Long
Dim PvtTable As PivotTable
Dim SheetName As String
Dim PTName As String
SheetName = "MySheetName1"
PTName = "PivotTable1"
On Error Resume Next
Application.DisplayAlerts = False
Worksheets(SheetName).Delete
Sheets.Add After:=ActiveSheet
ActiveSheet.Name = SheetName
Application.DisplayAlerts = True
Set PSheet = Worksheets(SheetName)
Set DSheet = Worksheets(1)
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Set pRange = DSheet.Cells(1, 1).Resize(LastRow, LastCol)
Set PCache = GetPivotCache(pRange) 'Here is where I call the function
Set PTable = PCache.CreatePivotTable _
(TableDestination:=PSheet.Cells(1, 1), TABLENAME:=PTName)
Sheets(SheetName).Select
Set PvtTable = ActiveSheet.PivotTables(PTName)
'Rows
With PvtTable.PivotFields("TypeCol")
.Orientation = xlRowField
.Position = 1
End With
With PvtTable.PivotFields("NameCol")
.Orientation = xlRowField
.Position = 2
End With
'Columns
With PvtTable.PivotFields("CategoryCol")
.Orientation = xlColumnField
.Position = 1
End With
'Values
PvtTable.AddDataField PvtTable.PivotFields("Values1"), "Value Balance", xlSum
PvtTable.AddDataField PvtTable.PivotFields("Values2"), "Value 2 Count", xlCount
End Sub
Проблемы с текущейфрагмент кода:
Работает только на одном источнике данных.Сценарий: если у меня 12 сводных таблиц, 6 сводных таблиц совместно используют источник данных 1, остальные 6 сводных таблиц совместно используют источник данных 2. Эта функция будет разрешать только один сводный кэш, если я не создаю дубликат той же функции.
Обновления в источнике данных не будут отражены.Сценарий: я выполняю макрос, который создает сводный кэш и сводную таблицу.Затем я добавляю 10 новых записей в свой источник данных и использую тот же макрос для обновления сводной таблицы.Эти 10 новых записей не будут включены, поскольку он все еще использует устаревший сводный кэш.
Эта проблема возникает, поскольку сводный кэш может быть создан только один раз.Как только он создан, он как бы «игнорирует» изменения, так как уже существует сводный кеш, который был создан.
Какие изменения можно внести в функцию GetPivotCache, чтобы помочь решить эту проблему?Как Excel знает, когда создавать новый сводный кеш?Я попытался записать макрос создания сводных таблиц, но я не вижу ничего похожего на проверку того, существует ли сводный кэш, для создания нового.