Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Ускорить работу макроса для скрытия PivotItems в сводной таблице

Автор bzzzu, 05.07.2013, 11:48

« назад - далее »

bzzzu

Добрый день!
Есть необходимость в сводной таблице оставлять видимыми только несколько элементов поля, а остальные скрывать.
Например, чтобы в сводной таблице отображались только последние 5 дат.
Написала вот такой рабочий макрос

Sub datasvod2()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

num_it_dc = Sheets("Динамика цен").PivotTables("Динамика").PivotFields("Цена").PivotItems.Count
If num_it_dc > 5 Then
    For a = 1 To num_it_dc - 5
        Sheets("Динамика цен").PivotTables("Динамика").PivotFields("Цена").PivotItems(a).Visible = False
    Next
End If

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub


Все работает, но если много элементов поля, то ооочень долго, особенно если обрабатывать таким образом несколько таблиц.
Подозреваю, что последовательный перебор и вот эта штука, PivotItems(i).Visible = True\False,  и есть корень зла.

Попробовала другой вариант, через for each и с использованием case

Sub datasvod1()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

For Each pf_date In Sheets("Динамика цен").PivotTables("Динамика").PivotFields("Цена").PivotItems
    ind_pf = pf_date.Index
Select Case ind_pf
    Case Is > 5
    pf_date.Visible = False
End Select
Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Но pf_date.Index упорно не работает, подозреваю, что это неспроста)

Так что прошу помощи в усовершенствовании любого из вариантов или идей для третьего варианта)
Пример таблицы с макросами приклепляю.

Шпец Докапыч

Что если использовать фильтр?
Sub ФильтрСводной()
  ДатСКонца = 5
  With ActiveSheet.PivotTables("Динамика").PivotFields("Дата")
    Дата = .PivotItems(.PivotItems.Count - ДатСКонца).SourceName
    МДГ = Split(Дата, ".")
    Дата = МДГ(1) & "." & МДГ(0) & "." & МДГ(2) 'МДГ -> ДМГ
    .ClearAllFilters
    .PivotFilters.Add Type:=xlAfter, Value1:=Дата
  End With
End Sub
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли

bzzzu

Цитата: Шпец Докапыч от 05.07.2013, 16:20
Что если использовать фильтр?

Решение, вообще говоря, отличное и работает быстро!) Сама бы не додумалась)
Спасибо большое  :D
Правда для пользователей не очень удобное( их сложные фильтры в тупик ставят, вроде галочками все отмечено, но не отображается)


Шпец Докапыч

Пожалуйста.
Можно перебрать (for each) все PivotFilters и посмотреть что там задано. Включать их поочёредно и вообще разобраться что к чему. Либо показать на форуме новый пример, если не получится разобраться самостоятельно.
Знания недостаточно, необходимо применение. Желания недостаточно, необходимо действие. (с) Брюс Ли