Страницы: 1
RSS
Макрос на выбор одного значения в Pivot Table.
 
Добрый день,  
У нас на работе используется выгрузка данных из OLAP через сводные таблицы.  
У меня есть однотипная операция, в которой мне надо отфильтровывать разные артикулы в сводной таблице. Когда я попыталась записать макрорекордером, процесс прервался, потому что какой-то размер операции превышен.    
Выглядело это следующим образом:  
 
   ActiveSheet.PivotTables("СводнаяТаблица3").CubeFields(2).TreeviewControl. _  
       Drilled = Array("")  
   ActiveSheet.PivotTables("СводнаяТаблица3").PivotFields( _  
       "[Артикулы 5].[Артикулкраткий]").HiddenItemsList = Array( _
       "[Артикулы 5].[All Артикулы 5].[А0650]", _
       "[Артикулы 5].[All Артикулы 5].[А0651]", _
       "[Артикулы 5].[All Артикулы 5].[А0654]", _
(… Далее перечисляется однотипный список и незаканчивая прерывается …)  
 
Мне надо выделить только один артикул например А0655. Как это можно записать в макросе?  
Насколько я понимаю, макрорекордер перечисляет весь список артикулов которые надо “спрятать”, мне же надо что бы по-умолчанию спрятаны были все артикулы и мне не надо было их перечислять, и что бы был отобран только один нужный мне артикул, который я задам в переменной.  
Помогите пожалуйста с решением.
Работать надо не 12 часов, а головой.
 
Попробовала другие варианты:  
   ActiveSheet.PivotTables("СводнаяТаблица3"). _  
   PivotFields("[Артикулы 5].[Артикулкраткий]") _
   .PivotItems([Артикулы 5].[All Артикулы 5].[А0650]).Visible = True
Вот так тоже не работает.  
Неужели безнадежно?
Работать надо не 12 часов, а головой.
 
{quote}{login=Leanna}{date=13.01.2012 11:35}{thema=Макрос на выбор одного значения в Pivot Table.}{post}...У меня есть однотипная операция, в которой мне надо отфильтровывать разные артикулы в сводной таблице...{/post}{/quote}  
Что в фильтре сводной выбрать, что выбрать даныые для фильра макроса - принцип один - зачем макрос?.. Поясните, и не на картинке, а на XL-примере, лучше *.xls - 97-2003... ;)  
-12720-
 
В Экселе написала то чего я хочу и какие преграды.  
 
Единственный момент, что в приложенном примере я на обычной сводной основываюсь, а мне нужно будет на олаповской сводной всё делать.  
 
Но для начала хотя бы по вложенному примеру бы разобрать, как фильтровать только  некоторые значения, не перебирая всю базу поименно.
Работать надо не 12 часов, а головой.
 
Sub PivotFiltr()  
Application.ScreenUpdating=False  
Dim i&  
  With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("месяц")  
   For i = 1 To .PivotItems.Count  
     If .PivotItems(i).Name = [g7].Value Then
       .PivotItems(i).Visible = True  
     Else  
       If .PivotItems(i).Visible Then .PivotItems(i).Visible = False  
     End If  
   Next  
 End With  
Application.ScreenUpdating = True  
End Sub
Спасибо
 
не вдавался в подробности, вопрос по тексту продцедруры, может эту часть  
...  
For i = 1 To .PivotItems.Count  
If .PivotItems(i).Name = [g7].Value Then
.PivotItems(i).Visible = True  
Else  
If .PivotItems(i).Visible Then .PivotItems(i).Visible = False  
End If  
Next  
...  
 
проще записать так:  
For i = 1 To .PivotItems.Count  
.PivotItems(i).Visible = .PivotItems(i).Name = [g7].Value
Next
Редко но метко ...
 
Он вылетает в ошибку, когда галочка с последней убрана, а на новую ещё не стоит (прикрепила).  
Что можно придумать?
Работать надо не 12 часов, а головой.
 
{quote}{login=GIG_ant}{date=13.01.2012 04:15}{thema=}{post}не вдавался в подробности, вопрос по тексту продцедруры, может эту часть  
...  
For i = 1 To .PivotItems.Count  
If .PivotItems(i).Name = [g7].Value Then
.PivotItems(i).Visible = True  
Else  
If .PivotItems(i).Visible Then .PivotItems(i).Visible = False  
End If  
Next  
...  
 
проще записать так:  
For i = 1 To .PivotItems.Count  
.PivotItems(i).Visible = .PivotItems(i).Name = [g7].Value
Next{/post}{/quote}  
 
проще оно конечно, проще  
ну не совсем  в данном случае это правильно.....  
Как мне кажеться в данном случае производить изменение свойства, всегда накладней чем его проверить. В твоем случае ты 12 раз меняешь свойство(даже если оно и не меняется), а у меня 2..или сколько это необходимо.  
 
 
да там еще добавить необходимо on error    
Sub PivotFiltr()  
Application.ScreenUpdating = False  
Dim i&  
On Error GoTo errV  
  With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("месяц")  
   For i = 1 To .PivotItems.Count  
     If .PivotItems(i).Name = [g7].Value Then
       .PivotItems(i).Visible = True  
     Else  
       If .PivotItems(i).Visible Then .PivotItems(i).Visible = False  
     End If  
   Next  
   
 Exit Sub  
errV:  .PivotFields("месяц").PivotItems([g7].Value).Visible = True
      .PivotItems(i).Visible = False  
End With  
 Application.ScreenUpdating = True  
End Sub
Спасибо
 
Спасибо большое, заработало.  
Правда в таком варианте когда после строки  
With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("месяц")  
поставить  
.PivotItems([g7].Value).Visible = True
и без errV: (с errV: выдает ошибку, не знаю почему)  
 
Понравилась запись, своей 'короткостью'  
.PivotItems(i).Visible = .PivotItems(i).Name = [g7].Value
Я только не понимаю что происходит при её исполнении, как она читается?    
вот это для меня .PivotItems(i).Name = [g7].Value - присвоить i-значению название из G7
.PivotItems(i).Visible = .PivotItems(i).Name - это не ясно , а всё вместе с двумя равно ещё непонятнее.  
Как работает команда?
Работать надо не 12 часов, а головой.
 
Возьмем выражение:  
 
b = 4 = 5  
сначала вычисляется значение после первого знака равно, то есть 4=5 оно дает False получается b = False  
 
Соответственно если записать b = 4 = 4 , тут b = True.  
 
Что бы было понятней можно писать с таким синтаксисом b = (4 = 5)
Редко но метко ...
 
Спасибо. Теперь всё ясно.
Работать надо не 12 часов, а головой.
 
Я попыталась применить полученные знания на сводной с ОЛАП. Но команда    
.PivotItems(i).Visible = False там не работает.  
Если смотреть как макрорекордер делает эту фильтрацию – он делает через .HiddenItemsList = Array(…тут весь перечень значений которые надо скрыть, за исключением того, который надо оставить…)  
Пример прикрепляю, но так как это ОЛАП, навряд ли сводная у вас будет работать. Внутри есть код макроса с указанием того места, где стопорится процедура.  
Привожу его сюда, на всякий:  
 
Sub PivotFiltr4()  
Sheets("артикулы").PivotTables("СводнаяТаблица2").CubeFields(2).TreeviewControl. _  
Drilled = Array("")  
Dim i&  
With Sheets("артикулы").PivotTables("СводнаяТаблица2").PivotFields("[Артикулы 5].[Артикулкраткий]")
   For i = 1 To .PivotItems.Count  
       If .PivotItems(i).Name <> [h1].Value Then
       .PivotItems(i).Visible = False 'не работает здесь!!!  
       End If  
   Next  
End With  
End Sub  
 
Вопрос в том – есть ли какая-нибудь альтернатива .PivotItems(i).Visible что бы использовать в ОЛАПовских сводных?  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
Работать надо не 12 часов, а головой.
 
Может есть какой-нибудь способ собрать список всех значений в массив? тогда исключив нужный артикул его можно было бы использовать в .HiddenItemsList = Array(…). Правда есть момент  For i = 1 To .PivotItems.Count - перечисляет только значения отмеченные галочкой (=видимые), а если я выделю все артикулы, то перерасчет зависнет на полчаса.  
 
Не знаю что делать… Помогите пожалуйста.
Работать надо не 12 часов, а головой.
 
Конечно кривой вариант, но раз другого никто не предлагает.  
Можно на отдельном  листе построить сводную-список со всем артикулами, она будет быстро пересчитываться в начале макроса, собирать массив значений, и этот массив загонять в  HiddenItemsList.  
Может так?
 
Да вариант, было бы удобно...    
Построила. Только при создании списка с помощью For i = 1 To .PivotItems.Count не включаются в массив некоторые значения, которые есть в выпадающем списке.  
Это видимо безнадежный случай.  
 
В принципе спасение получилось найти поместив артикулы в правое-верхнее поле сводной.    
ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields("[Артикулы 5]"). _
CurrentPageName = "[Артикулы 5].[All Артикулы 5].[" & [H1].Value & "]"
 
В принципе так тоже сойдет. Жаль идела не полусилось. Для идеала надо переходить на 2007, там появились новые возможности.  
Всё равно, спасибо за помощь.
Работать надо не 12 часов, а головой.
 
{quote}{login=Leanna}{date=17.01.2012 01:55}{thema=}{post}Да вариант, было бы удобно...    
Построила. Только при создании списка с помощью For i = 1 To .PivotItems.Count не включаются в массив некоторые значения, которые есть в выпадающем списке.  
Это видимо безнадежный случай.  
 
В принципе спасение получилось найти поместив артикулы в правое-верхнее поле сводной.    
ActiveSheet.PivotTables("СводнаяТаблица2").PivotFields("[Артикулы 5]"). _
CurrentPageName = "[Артикулы 5].[All Артикулы 5].[" & [H1].Value & "]"
 
В принципе так тоже сойдет. Жаль идела не полусилось. Для идеала надо переходить на 2007, там появились новые возможности.  
Всё равно, спасибо за помощь.{/post}{/quote}  
 
лучше на 2010 + POWER PIVOT, там возможностей еще больше, и скорости обработки данных не соизмеримы.
Спасибо
 
{quote}{login=R Dmitry}{date=17.01.2012 02:09}{thema=Re: }{post}{quote}  
лучше на 2010 + POWER PIVOT, там возможностей еще больше, и скорости обработки данных не соизмеримы.{/post}{/quote}  
Буду иметь ввиду. Правда пока на работе предлагают только переход на 2007. Спасибо.
Работать надо не 12 часов, а головой.
Страницы: 1
Читают тему
Наверх