Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/VBA. Фильтрация сводных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » VBA. Фильтрация сводных
VBA. Фильтрация сводных
nerv Дата: Среда, 13.02.2013, 22:26 | Сообщение № 1
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Всем привет

Это дубликат темы

Приходится работать со сводными в VBA. Есть такой код, который фильтрует поле сводной

[vba]
Код
Private Sub SetPivotItemsFilter(ByRef Pivot As PivotTable, _
                    ByRef PivotField As PivotField, _
                    ParamArray ItemNames() As Variant)
     Dim PivotItem As PivotItem
     Dim ItemName As Variant
      
     Pivot.ManualUpdate = True
      
     For Each PivotItem In PivotField.PivotItems
         PivotItem.Visible = False
          
         For Each ItemName In ItemNames
             If StrComp(PivotItem.Name, ItemName, vbTextCompare) = 0 Then
                 PivotItem.Visible = True
                 Exit For
             End If
         Next
     Next
      
     Pivot.ManualUpdate = False
     Pivot.Update
End Sub
[/vba]

Проблема в том, что, если сводная большая, из-за "идет расчет сводной" он работает долго.

  • Как ускорить?
  • Возможно ли это?
  • Может я вообще что-то делаю не так?


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
СообщениеВсем привет

Это дубликат темы

Приходится работать со сводными в VBA. Есть такой код, который фильтрует поле сводной

[vba]
Код
Private Sub SetPivotItemsFilter(ByRef Pivot As PivotTable, _
                    ByRef PivotField As PivotField, _
                    ParamArray ItemNames() As Variant)
     Dim PivotItem As PivotItem
     Dim ItemName As Variant
      
     Pivot.ManualUpdate = True
      
     For Each PivotItem In PivotField.PivotItems
         PivotItem.Visible = False
          
         For Each ItemName In ItemNames
             If StrComp(PivotItem.Name, ItemName, vbTextCompare) = 0 Then
                 PivotItem.Visible = True
                 Exit For
             End If
         Next
     Next
      
     Pivot.ManualUpdate = False
     Pivot.Update
End Sub
[/vba]

Проблема в том, что, если сводная большая, из-за "идет расчет сводной" он работает долго.

  • Как ускорить?
  • Возможно ли это?
  • Может я вообще что-то делаю не так?

Автор - nerv
Дата добавления - 13.02.2013 в 22:26
nilem Дата: Четверг, 14.02.2013, 09:39 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
ну если "поячеешно", то словарик какой-нибудь что ли
[vba]
Код
Sub ert()
Dim pvt As PivotTable, pvtField As PivotField, arrNames$(1)
Set pvt = ActiveSheet.PivotTables("СводнаяТаблица1")
Set pvtField = pvt.PivotFields("Наим")
arrNames(0) = "ыва": arrNames(1) = "sdf"
Call SetPivotItemsFilter(pvt, pvtField, arrNames())
End Sub

Private Sub SetPivotItemsFilter(pvt As PivotTable, _
                    pvtField As PivotField, _
                    ItemNames() As String)
Dim pvtItem As PivotItem, x
pvtField.ClearAllFilters
'Pivot.ManualUpdate = True    ' это типа ScreenUpdating?
With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For Each x In ItemNames()
         .Item(x) = Empty
     Next x
     For Each pvtItem In pvtField.PivotItems
         If Not .Exists(pvtItem.Name) Then pvtItem.Visible = False
     Next
End With
End Sub
[/vba]
вообще, в сводных наверняка есть что-то вроде фильтра с массивом в кач-ве критериев, и все это запишется в одну строку, надо только поискать


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениену если "поячеешно", то словарик какой-нибудь что ли
[vba]
Код
Sub ert()
Dim pvt As PivotTable, pvtField As PivotField, arrNames$(1)
Set pvt = ActiveSheet.PivotTables("СводнаяТаблица1")
Set pvtField = pvt.PivotFields("Наим")
arrNames(0) = "ыва": arrNames(1) = "sdf"
Call SetPivotItemsFilter(pvt, pvtField, arrNames())
End Sub

Private Sub SetPivotItemsFilter(pvt As PivotTable, _
                    pvtField As PivotField, _
                    ItemNames() As String)
Dim pvtItem As PivotItem, x
pvtField.ClearAllFilters
'Pivot.ManualUpdate = True    ' это типа ScreenUpdating?
With CreateObject("Scripting.Dictionary")
     .CompareMode = 1
     For Each x In ItemNames()
         .Item(x) = Empty
     Next x
     For Each pvtItem In pvtField.PivotItems
         If Not .Exists(pvtItem.Name) Then pvtItem.Visible = False
     Next
End With
End Sub
[/vba]
вообще, в сводных наверняка есть что-то вроде фильтра с массивом в кач-ве критериев, и все это запишется в одну строку, надо только поискать

Автор - nilem
Дата добавления - 14.02.2013 в 09:39
nerv Дата: Четверг, 14.02.2013, 20:43 | Сообщение № 3
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

nilem, спасибо за ответ.

Словарь там особо не нужен, ItemNames() порядка 10 элементов.
Тормоза из-за сводной и ее обновления.

Помогает,
[vba]
Код
Pivot.ManualUpdate = True

' some code

Pivot.ManualUpdate = False
[/vba]
но не особо.

Эта штука мега-медленная
[vba]
Код
PivotItem.Visible = [True|False]
[/vba]

Полазил по хелпу vba. Есть такое
[vba]
Код
PivotField.VisibleItemsList = Array()

' or

PivotField.HiddenItemsList = Array()
[/vba]
но работает только с OLAP.


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщениеnilem, спасибо за ответ.

Словарь там особо не нужен, ItemNames() порядка 10 элементов.
Тормоза из-за сводной и ее обновления.

Помогает,
[vba]
Код
Pivot.ManualUpdate = True

' some code

Pivot.ManualUpdate = False
[/vba]
но не особо.

Эта штука мега-медленная
[vba]
Код
PivotItem.Visible = [True|False]
[/vba]

Полазил по хелпу vba. Есть такое
[vba]
Код
PivotField.VisibleItemsList = Array()

' or

PivotField.HiddenItemsList = Array()
[/vba]
но работает только с OLAP.

Автор - nerv
Дата добавления - 14.02.2013 в 20:43
Gamid Дата: Воскресенье, 13.12.2015, 14:03 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Друзья, не могли бы Вы прокомментировать код, который указали выше (если не трудно)

[vba]
Код
Sub ert()
Dim pvt As PivotTable, pvtField As PivotField, arrNames$(1)
Set pvt = ActiveSheet.PivotTables("СводнаяТаблица1")
Set pvtField = pvt.PivotFields("Наим")
arrNames(0) = "ыва": arrNames(1) = "sdf"
Call SetPivotItemsFilter(pvt, pvtField, arrNames())
End Sub

Private Sub SetPivotItemsFilter(pvt As PivotTable, _
pvtField As PivotField, _
ItemNames() As String)
Dim pvtItem As PivotItem, x
pvtField.ClearAllFilters
'Pivot.ManualUpdate = True ' это типа ScreenUpdating?
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For Each x In ItemNames()
.Item(x) = Empty
Next x
For Each pvtItem In pvtField.PivotItems
If Not .Exists(pvtItem.Name) Then pvtItem.Visible = False
Next
End With
End Sub
[/vba]

Также не могу понять, для чего ArrNames$, почему он просто идет через запятую. Так же и для х (просто идет через запятую)


Сообщение отредактировал Serge_007 - Воскресенье, 13.12.2015, 19:30
 
Ответить
СообщениеДрузья, не могли бы Вы прокомментировать код, который указали выше (если не трудно)

[vba]
Код
Sub ert()
Dim pvt As PivotTable, pvtField As PivotField, arrNames$(1)
Set pvt = ActiveSheet.PivotTables("СводнаяТаблица1")
Set pvtField = pvt.PivotFields("Наим")
arrNames(0) = "ыва": arrNames(1) = "sdf"
Call SetPivotItemsFilter(pvt, pvtField, arrNames())
End Sub

Private Sub SetPivotItemsFilter(pvt As PivotTable, _
pvtField As PivotField, _
ItemNames() As String)
Dim pvtItem As PivotItem, x
pvtField.ClearAllFilters
'Pivot.ManualUpdate = True ' это типа ScreenUpdating?
With CreateObject("Scripting.Dictionary")
.CompareMode = 1
For Each x In ItemNames()
.Item(x) = Empty
Next x
For Each pvtItem In pvtField.PivotItems
If Not .Exists(pvtItem.Name) Then pvtItem.Visible = False
Next
End With
End Sub
[/vba]

Также не могу понять, для чего ArrNames$, почему он просто идет через запятую. Так же и для х (просто идет через запятую)

Автор - Gamid
Дата добавления - 13.12.2015 в 14:03
Мир MS Excel » Вопросы и решения » Вопросы по VBA » VBA. Фильтрация сводных
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!