Обновить один свод с общим кэшем - PullRequest
0 голосов
/ 19 февраля 2019

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


У меня есть 5 сводных таблиц (каждая с одним и тем же источником данных: Table1) в приведенной ниже структуре

Column A
----------
Pivot 1
'Two Blank Rows
Pivot 2
'Two Blank Rows
Pivot 3 
'Two Blank Rows
Pivot 4
'Two Blank Rows
Pivot 5
'Two Blank ROws

Макрос предназначен для перемещения Pivot 1 по 6 столбцам, обновляя только эту точку поворота (позволяя ему расширяться или сжиматься столько, сколько необходимо).Затем макрос перемещается Pivot 2 по 6 столбцам и размещает его на две строки ниже первого центра, обновляет только этот элемент и т. Д. Процесс повторяется для всех элементов, а затем я удаляю 6 столбцов, создавая впечатление, что все таблицы вернулись в своиисходная отправная точка, за исключением того, что строки таблицы были соответственно расширены / сжаты, не сталкиваясь с проблемой ERROR: A pivot table cannot overlap another pivot table.Когда ScreenUpdating выключен, создается впечатление, что стержни обновляют и динамически корректируют свое положение для расширения / сжатия окружающих таблиц.


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

Я пробовал две строки кода в центре цикла и пытался использовать найденный макросна это ссылка, которая нацелена на разделение общего сводного кэша, что позволяет выполнять независимое обновление.Макрос по этой ссылке просто каждый раз вылетает мой экземпляр excel.

For i = LBound(OTCPvts) To UBound(OTCPvts)
    LRow = OTC.Range("O" & OTC.Rows.Count).End(xlUp).Offset(3).Row
    OTC.PivotTables(OTCPvts(i)).TableRange2.Cut OTC.Range("M" & LRow)
    On Error Resume Next

        OTC.PivotTables(OTCPvts(i)).PivotCache.Refresh 'Gives Overlap Error
        OTC.PivotTables(OTCPvts(i)).RefreshTable 'Does not refresh/change table

    On Error GoTo 0
Next i

Отображение только соответствующего кода - процесс переходит к фильтрации / сортировке перед переходом к Next i, но все это прекрасно работает

1 Ответ

0 голосов
/ 21 февраля 2019

Итак, вернувшись к этому, я обнаружил другой вид хакерского обходного пути, который не включает перемещение таблиц более одного раза.Хотя обновление общего сводного кэша, по-видимому, обновляет все сводные таблицы, совместно использующие этот кеш, вы можете применить фильтр xlTopCount со значением 1 ко всем из них перед обновлением, затем переместить каждую таблицу и удалить фильтр * 1003.*

For i = LBound(OTCPvts) To UBound(OTCPvts)
    With OTC.PivotTables(OTCPvts(i))
        .ClearAllFilters
        .PivotFields("FieldName").PivotFilters.Add2 _
            Type:=xlTopCount, DataField:=.PivotFields("OtherFieldName"), Value1:=1
        .PivotCache.Refresh
        .RefreshTable
    End With
Next i
For i = LBound(OTCPvts) To UBound(OTCPvts)
    With OTC.PivotTables(OTCPvts(i))
        lRow = OTC.Range("O" & OTC.Rows.Count).End(xlUp).Offset(3).Row
        .TableRange2.Cut OTC.Range("M" & lRow)
        .ClearAllFilters
    End With
Next i

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

...