2014-02-01 4 views
3

Я имитирую клик на Excel Slicer с помощью VBA, но столкнулся с серьезными проблемами производительности.Плохое обновление производительности Excel выбор слайсера с помощью VBA

Пользователь нажимает на столбец с датами на оси X. При нажатии на столбец соответствующая дата выбирается в слайсере, содержащем список дат. Список будет продолжать расти со временем.

Единственный способ, насколько мне известно, установить выбор слайсера для источников данных, отличных от OLAP (мой случай), это установить отдельно = true для каждого элемента slicer. По мере того, как пересчет срабатывает при каждой настройке, это очень медленно для слайсеров со многими элементами.

Небольшой пример кода, показывающий эту проблему:

On Error GoTo Err_Handler: 

Dim SC As SlicerCache 
Set SC = ActiveWorkbook.SlicerCaches("Slicer_DATE") 

Dim SI As SlicerItem 

Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 

For Each SI In SC.SlicerItems 
    SI.Selected = True 
Next 

Err_Handler: 
Application.Calculation = xlCalculationAutomatic 
Application.EnableEvents = True 

Аналогичные вопросы были заданы перед:

Selecting multiple slicer items at once without a refresh

Pivot Slicer Update To Slow, Can I pause all functions until slicer update is complete?

Там предложение либо:

Application.EnableEvents = false 

или

Application.Calculation = xlCalculationManual 

UPDATE: Я также заметил, что, несмотря на выключая события и расчет, все сводные таблицы в самом деле перерасчета!

Для меня ни один из этих вариантов не работает и не улучшает производительность. Вычисление действительно отложено и никаких событий не происходит. Тем не менее, каждая итерация выбранного = true занимает около 1,5 секунд. В общей сложности операция занимает около 5 минут.

Мой слайсер подключен к 23 сводным таблицам (!) На нескольких листах. Базовые данные (соединение MS Access DB) составляют около 60 000 строк с ~ 20 переменными, что не так много.

Любая помощь приветствуется.

ответ

4

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

Пожалуйста, попробуйте добавить это право выше, где ваше обновление кода ломтерезки является:

Dim PT As PivotTable 
Dim wb As Workbook 
Dim ws As Worksheet 

Set wb = ThisWorkbook 

For Each ws In wb.Sheets 
    For Each PT In ws.PivotTables 
     PT.ManualUpdate = True 
    Next PT 
Next ws 

А потом добавить это после того, как вы обновили слайсер:

For Each ws In wb.Sheets 
    For Each PT In ws.PivotTables 
     PT.ManualUpdate = False 
    Next PT 
Next ws 

Для получения дополнительной информации:
Speed up pivot table filtering VBA code
Turn Off PT Calc
MSDN: ManulaUpdate

Надеюсь, что это поможет!

+1

спасибо. Мне удалось решить проблему. Только проблема заключается в том, что при настройке ManualUpdate = False все форматирование пользовательских серий теряется, и я должен записать макрос для запуска в конце кода, чтобы правильно установить форматирование. – Jonas

+0

Рад, что это помогло! Спасибо за продолжение! – ARich

+0

Я пробовал все вышеперечисленное, и все еще была заметная задержка в одном из моих slicers, у которого было 50+ опций (у меня есть 4 каскадных слайсера). Установка значения Selected выполняется медленно, в моем случае установка всех, кроме одного, значения false. Я ускорил его, проигнорировав те, которые имеют «.hasdata = false», потому что установка их в false не влияет на выбранные значения следующих зависимых slicers. – DWiener

2

Что вам нужно сделать, это Дублируйте Slicer и Дубликат поля как ограничитель и фильтр отчета см http://www.powerpivotpro.com/2010/12/another-way-to-get-and-use-slicer-values-in-formulas/

Затем используйте свойство CurrentPage, чтобы выбрать пункт:

Private Sub SelectPivotItem(FieldName As String, Itemname As String) 
    Dim PT As PivotTable, PTF As PivotField, PTI As PivotItem 
    Set PT = shtInt.PivotTables("PivotTable1") 
    Set PTF = PT.PivotFields(FieldName) 
    PTF.ClearAllFilters 
    PTF.CurrentPage = Itemname 
End Sub 
+0

Удобное решение, спасибо !!! –

0

Это помогает массово работать. Тот же подход применяется к выбору нескольких PivotItems в VBA.

  1. Установите сводные таблицы в ManualUpdate.
  2. Скрыть все листы, содержащие сводные таблицы, на которые воздействует Slicer, когда вы выполняете выбор нескольких слайсеров.

Не забудьте установить сводные таблицы не ManualUpdate когда сделано, и установить листы видны потом, если вам нужно

Это очень странно, потому что даже с Application.ScreenUpdating = False это все еще помогает чрезвычайно ,

Я получил свой макрос выбора PivotItems с 3 минут до 3 секунд, выполнив это. Довольно резкое различие.

К сожалению, для Slicers это все еще медленно, около 30 секунд. Я хочу переключиться на это с помощью VBA и PivotItems и полностью избегать использования Slicers, если только я не смогу найти другой способ повысить производительность.

Смежные вопросы