Excel VBA - обновление сводного кэша - PullRequest
0 голосов
/ 22 ноября 2018

Недавно я искал способы совместного использования одного и того же сводного кэша среди нескольких сводных таблиц, поскольку все они используют один и тот же источник данных.Это помогает существенно уменьшить размер файла 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

Проблемы с текущейфрагмент кода:

  1. Работает только на одном источнике данных.Сценарий: если у меня 12 сводных таблиц, 6 сводных таблиц совместно используют источник данных 1, остальные 6 сводных таблиц совместно используют источник данных 2. Эта функция будет разрешать только один сводный кэш, если я не создаю дубликат той же функции.

  2. Обновления в источнике данных не будут отражены.Сценарий: я выполняю макрос, который создает сводный кэш и сводную таблицу.Затем я добавляю 10 новых записей в свой источник данных и использую тот же макрос для обновления сводной таблицы.Эти 10 новых записей не будут включены, поскольку он все еще использует устаревший сводный кэш.

Эта проблема возникает, поскольку сводный кэш может быть создан только один раз.Как только он создан, он как бы «игнорирует» изменения, так как уже существует сводный кеш, который был создан.

Какие изменения можно внести в функцию GetPivotCache, чтобы помочь решить эту проблему?Как Excel знает, когда создавать новый сводный кеш?Я попытался записать макрос создания сводных таблиц, но я не вижу ничего похожего на проверку того, существует ли сводный кэш, для создания нового.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...