2016-02-08 5 views
0

У меня есть поле фильтра week_of_year (1,2,3,4,5,6,7,8 ....), другое поле года поворота (2012,2013,2014), код vba фильтрует фильтр на текущей неделе и году 2014/2015 года и скрывает все остальное. Но проблема в том, что код циклирует каждую запись и работает медленно, когда дело доходит до большой сводной таблицы. Я пытаюсь создать новый код, но столкнулся с некоторой ошибкой.Ошибка фильтра VBA

Sub datefilter() 
Dim PvtTbl As PivotTable 
Set PvtTbl = Worksheets("LO").PivotTables("PivotTable3") 
Dim dd As Integer 
dd = Format(Date, "ww") 
Dim pf As PivotField 
Dim pf1 As PivotField 
Dim PI As PivotItem 
Set pf =    

Worksheets("LO").PivotTables("PivotTable3").PivotFields("week_of_year") 
Set pf1 =  
Worksheets("LO").PivotTables("PivotTable3").PivotFields("year") 
PvtTbl.ClearAllFilters 
For Each PI In pf.PivotItems 
If PI.Name = CStr(dd) Then 

    PI.Visible = True 
Else 
    PI.Visible = False 
End If 
Next 

For Each PI In pf1.PivotItems 
If PI.Name = "2014" Or PI.Name = "2015" Then 
    PI.Visible = True 
Else 
    PI.Visible = False 
End If 
Next 
End Sub 

Новый код, который я развиваю это:

Sub datefilter1() 
Dim PvtTbl As PivotTable 
Set PvtTbl = Worksheets("LO").PivotTables("PivotTable3") 
Dim dd As Integer 
dd = Format(Date, "ww") 
Dim pf As PivotField 
Set pf =   
Worksheets("LO").PivotTables("PivotTable3").PivotFields("week_of_year") 
pf.PivotFilters.Add2 xlValueEquals, 3 
End Sub 

Код потерпел неудачу в

pf.PivotFilters.Add2 xlValueEquals, CStr(dd) 

Я также попытался:

pf.PivotFilters.Add2 Type:= xlValueEquals, Value1 := CStr(dd) 

Ошибка Недопустимый вызов процедуры или аргумент. Любая идея Как я могу исправить эту ошибку? ????

Любой более быстрый способ фильтровать по нескольким критериям фильтра? Благодаря!

+1

Фильтры отчета о сводной таблице немного отличаются от фильтров ярлыков Row/Column. К сожалению, вы придерживаетесь метода цикла. –

+0

ни в коем случае ..... петли берут навсегда. Я пытаюсь использовать метод Currentpage. Любая идея с этим? – Sailormoon

+0

Скотт прав.Метод CurrentPage показывает только один элемент pivotItem, а не несколько и не может быть изменен, чтобы отображать больше одного, за исключением использования метода циклирования. Если вы хотите сделать что-то другое, возможно, вы можете использовать вспомогательный столбец для ваших данных (weekRange1 соответствует неделям 1-8) и фильтровать его с помощью параметра текущей страницы. – OpiesDad

ответ

1

Если вы хотите, чтобы фильтровать по одному значению перетащите поле интереса к панели Report Filter, то вы можете сделать это очень быстро, без зацикливания, используя следующий код:

Sub FilterOnWeek() 
Dim pt As PivotTable 
Dim pf As PivotField 


Set pt = Worksheets("LO").PivotTables("PivotTable3") 
Set pf = pt.PivotFields("week_of_year") 

pf.CurrentPage = Format(Date, "ww") 
End Sub 

Если по каким-то причинам это поле обязательно должно находиться в сводной таблице как поле строки, вы можете фильтровать без зацикливания следующего метода, если у вас есть Excel 2010 или более поздняя версия

  1. Сделайте копию сводной таблицы, и перетащите «WEEK_OF_YEAR» поле в копии фильтра отчетов. a
  2. Настройте слайсер в поле week_of_year на одной сводной таблице, а подключите его к другой сводной таблице с помощью диалогового окна «Подключения отчета» . (Щелкните правой кнопкой мыши на Slicer, выберите «Подключения к отчету»)
  3. Изменить приведенный выше код, чтобы он работал во второй сводной таблице.

Слайсер затем синхронизирует две сводные таблицы.

Если вы хотите, чтобы фильтровать более одного значения, перетащите поле в области рядов, и использовать это:

Sub FilterOnWeek2() 
Dim pt As PivotTable 
Dim pf As PivotField 
Dim pi As PivotItem 
Dim lStart As Long 
Dim lEnd As Long 


lEnd = Format(Date, "ww") 
lStart = Val(Format(Date, "ww")) - 1 

Set pt = Worksheets("LO").PivotTables("PivotTable3") 
Set pf = pt.PivotFields("week_of_year") 

With pf 
    .ClearAllFilters 
    .PivotFilters.Add Type:=xlCaptionIsBetween, Value1:=lStart, Value2:=lEnd 
End With 

End Sub 

Если по какой-то причине вы не хочет это поля в PivotTable как поле строки, выполните тот же общий подход, что и выше: сделайте копию сводной таблицы, поместите поле, которое вы хотите фильтровать в копии, как поле ROWS, соедините интересующие поля вместе как слайсер, скройте где-нибудь, и измените код, чтобы он работал на копии сводной таблицы с полем строки в ней.

Я рекомендую вам прочитать мою статью по адресу http://dailydoseofexcel.com/archives/2013/11/14/filtering-pivots-based-on-external-ranges/, если вы хотите узнать больше об эффективной фильтрации сводных таблиц.

+0

Привет, Джефф, я фактически снял текущую страницу с моего кода, потому что она позволяет только одно значение, если я хочу, чтобы несколько элементов говорили, что они не будут работать. Если мне нужна текущая неделя и предыдущая неделя, вы знаете, как это сделать? Благодаря!! – Sailormoon

+0

См. Мой исправленный ответ выше. – jeffreyweir

+0

Джеффри благодарит, что только захватить два элемента, что, если я хочу несколько элементов, только с датой, но также со строками? Любое решение с этим? У меня есть три фильтра в моей оси, и все они должны быть закодированы с указанием даты, значения и нескольких элементов. с этим условием, будет ли мой единственный вариант зацикливать каждую запись? Еще раз спасибо!!!!!! – Sailormoon

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