Страницы: 1
RSS
Ускорение работы макроса, выставляющего значение в фильтре сликера
 
Добрый день!

Создал макрос, который среди прочего выставляет фильтр по одному значению в сликере сводной таблицы.
Файл с персональными данными, поэтому скопировать дословно код или выложить всю таблицу не могу.
В целом, выглядит это так (где "..." порядка 60 раз повторяется SlicerItems с разными значениями = False):
Код
With ActiveWorkbook.SlicerCaches("Slicer_DSPV")
        .SlicerItems("Ваня").Selected = True
...
        .SlicerItems("Федя").Selected = False
        .SlicerItems("Степа").Selected = False
    End With

Это работает. На примере выше в итоге после применения макроса в сводной остаются только значения по Ване.
Однако, когда строк с SlicerItems много, макрос после запуска очень долго выполняет фильтрацию, хотя просто в экселе поставить фильтра по конкретному человеку занимает секунду.

Подскажите, пожалуйста, как изменить код, чтоб он работал быстрее?

P.S.
Применял
Код
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Проблему в обилии строк в коде, которые очень долго обрабатыаются, это решить не помогло.
 
Проблема в Selected. Работа с объектами листа медленная
Цитата
VBA_beginner написал: Файл с персональными данными, поэтому скопировать дословно код или выложить всю таблицу не могу.
Сесть и нарисовать НЕБОЛЬШОЙ пример с отвлеченными данными некогда...
 
Нарисовал небольшой пример)
 
Доброе время суток.
Если срез сделать на сводной, построенной по модели Power Pivot, то это просто сделать. А вот для среза по обычной сводной, похоже, ничего подобного нет.
 
Цитата
vikttur написал:
Проблема в Selected. Работа с объектами листа медленная
Можете, пожалуйста, показать как от нее избавиться на примере выше?
 
VBA_beginner, здравствуйте!
Как фильтровать срез по одному элементу без цикла я не знаю, но выставить фильтр сводной можно так:
Для активного листа со сводной
Или для вашего случая (в файле)
, в любом случае ManualUpdate=True должен ускорить любую работу макроса со сводной (спасибо sokol92 за науку)

P.S.: И, кстати, "слайсера", а не "сликера", если уж слово общепризнанное слово "срез", всегда используемое в аналитике, вам очень не нравится…
Изменено: Jack Famous - 24.06.2019 10:14:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, спасибо! Помогло.

Цитата
Jack Famous написал:
в любом случае ManualUpdate=True должен ускорить  любую  работу макроса со сводной (спасибо  sokol92  за науку)
Я правильно понимаю, что сводная обновляется после каждого действия макроса над ней, а ManualUpdate=True это останавливает, потому меньше времени и уходит?

Цитата
Jack Famous написал:
P.S.: И, кстати, " слайсера ", а не "сликера", если уж слово общепризнанное слово "срез", всегда используемое в аналитике, вам очень не нравится…
Спасибо, что обратили внимание. Пользовался только английской версией Экселя, потому не устоялось в голове русское название общепризнанное.

Проблема решена созданием дополнительного фильтра, но тема остается актуальной. Интересно очень, можно все-таки заставить макрос быстрее со срезами работать?
 
VBA_beginner, пожалуйста  ;)
Цитата
VBA_beginner: Я правильно понимаю, что сводная обновляется после каждого действия макроса над ней
Справка, а именно True if the PivotTable report is recalculated only at the user's request (включает пересчёт только по запросу). Особого ускорения на своих данных я не заметил, но оно точно есть (мелочь, а приятно).
Изменено: Jack Famous - 24.06.2019 15:49:51
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх