Ускорьте фильтрацию сводных таблиц кода VBA - PullRequest
6 голосов
/ 19 апреля 2009

У меня есть сводная таблица с полем сводки, в которой содержится много элементов. У меня есть логика кода VBA, чтобы решить, должно ли значение сводки быть видимым или нет. Проблема в том, что Excel пересчитывает сводную таблицу для каждого показанного или скрытого поля, что делает его очень медленным. Я хотел бы что-то, где он пересчитывает только один раз, после того, как все значения установлены. Я пытался использовать Application.Calculation = xlCalculationManual, но это не помогло.

код VBA, который я использую, выглядит примерно так

For i = 1 To oPivotField.PivotItems.Count
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then
        oPivotField.PivotItems(i).Visible = True   'Recalulates pivot table
    Else
        oPivotField.PivotItems(i).Visible = False 'Recalulates pivot table
    End If
Next

Я должен сделать это вручную, сняв флажок «Показать все» и повторно отметив поля, которые я хочу видеть. Это приводит к тому, что Excel пересчитывает один раз и показывает только те элементы, которые я хочу видеть. Я хотел бы сделать то же самое с помощью кода VBA.

Я даже пытался использовать

Application.ScreenUpdating = False
Application.DisplayAlerts = False

но не сработало.

Ответы [ 5 ]

7 голосов
/ 22 апреля 2010

О! Я только что решил это:

В начале вашего кода отключите автообновление следующим образом:

PivotTable.ManualUpdate = True

А затем в конце кода снова включите его:

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh

Я обнаружил, что этот поток ищет справочную информацию, которая определяет, должно ли быть видно значение сводной таблицы. Что стоит за вашим oPivotField? Это та часть, по которой я скучаю!

4 голосов
/ 19 апреля 2009

PivotTable объекты имеют свойство ManualUpdate, которое может быть тем, что вы ищете.

См. http://www.ozgrid.com/VBA/hide-pivot-fields.htm для некоторого связанного кода

0 голосов
/ 21 сентября 2016

сводная таблица.ManualUpdate [= настройка]
Значение True приводит к тому, что RefreshTable удаляет данные из сводной таблицы, а не обновляет их
False позволяет RefreshTable работать нормально.
По умолчанию установлено значение False.
Это свойство автоматически сбрасывается в False после завершения вызывающей процедуры ( важно )

Это свойство должно быть установлено в значение true перед обновлением (например, изменение сводного элемента Visible свойство)
Итак, ваш код будет выглядеть так:

For i = 1 To oPivotField.PivotItems.Count
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then
        oPivotField.Parent.ManualUpdate = True
        oPivotField.PivotItems(i).Visible = True  'doesn't recalculate pivot table because ManualUpdate is set to True
    Else
        oPivotField.Parent.ManualUpdate = True
        oPivotField.PivotItems(i).Visible = False 'doesn't recalculate pivot table because ManualUpdate is set to True
    End If
Next

'setting pivot table ManualUpdate property to False might be redundant at this point because it gets reset to false immediately after you set Visible property of oPivotField
oPivotField.Parent.ManualUpdate = False
oPivotField.Parent.Update()

В заключение, изменение свойства ManualUpdate не длится долго (в моих тестах я видел, что оно сбрасывается в false как можно скорее, поэтому я рекомендовал вам устанавливать его в true, когда вы хотите внести изменения для сводного элемента)

Для получения дополнительной информации о том, что означает обновление в Excel, вы можете проверить следующее:
Обновление сводки против обновления - есть ли реальная разница?

Ссылки:
Название: Программирование Excel с VBA и .NET
Автор: Джефф Уэбб, Стив Сондерс
Печать ISBN: 978-0-596-00766-9 | ISBN 10: 0-596-00766-3
Электронная книга ISBN: 978-0-596-15951-1 | ISBN 10: 0-596-15951-X

0 голосов
/ 08 февраля 2016

Попробуйте добавить следующее. Помогло дать дополнительную скорость в моем случае.

В начале:

Application.Calculation = xlCalculationManual

В конце:

Application.Calculation = xlCalculationAutomatic
0 голосов
/ 18 сентября 2015

Сохраните копию своей рабочей книги и сохраните ее как файл "excel 93-2007". Тогда попробуйте свой код. Надеюсь, это поможет вам.

...