2015-12-16 5 views
0

Я пытаюсь создать модуль для совместного использования функций по нескольким листам в одной книге. Все работает отлично, кроме кода фильтра.

ниже код работает отлично, если я помещаю его в одном рабочем листеExcel VBA for pivot Значение с использованием xlValueIsBetween

ActiveSheet.PivotTables("PivotTable1").PivotFields("MyField"). _ 
    ClearValueFilters 
ActiveSheet.PivotTables("PivotTable1").PivotFields("MyField").PivotFilters.Add Type:=xlValueIsBetween, DataField:=ActiveSheet.PivotTables _ 
    ("PivotTable1").PivotFields("MyValue"), Value1:=bottom, Value2:=Top 

Однако я хочу использовать этот код в моем модуле и отправить его следующим образом:

Pivot Table Name,
Row PivotField,
значения поля кронштейна
верх «между» значением
дна «между» значением

что-то вроде:

листа вызова

Call Mod_Filter("PivotTable1", "MyRowFieldName", "MyValueFieldName", 0, intvalue) 

Модуль Код

Public Sub Mod_Filter(ByRef PT_Name As String, ByRef StaticField As String, ByRef Filter_field As String, bottom As Double, Top As Double) 
    ActiveSheet.PivotTables(PT_Name).PivotFields(StaticField).ClearValueFilters 
    ActiveSheet.PivotTables(PT_Name).PivotFields(StaticField).PivotFilters.Add Type:=xlValueIsBetween, DataField:=ActiveSheet.PivotTables _ 
    (PT_Name).PivotFields(Filter_field), Value1:=bottom, Value2:=Top 
End Sub 

Однако, я не могу получить эту работу. Какие-либо предложения??

enter image description here

Так я использую «St» Row для фильтрации% с начала года на основе значения, выбранного из выпадающего выпадающего списка

+0

Я думаю, вам нужно заменить ActiveSheet с реальным объектом листа, который содержит стержень (по крайней мере). –

+0

Спасибо @BobPhillips. Я действительно пробовал это, но до сих пор нет радости! – MiguelH

+0

Я также попытался переместить этот суб в рабочий лист (вместо вызова модуля), но это тоже не работает! – MiguelH

ответ

1

Требование: Для фильтрации Pivot RowField, основанный на сводная DataField

Эта процедура использует PivotField.SourceName для проверки & установить DataField применить тип фильтра и значение.

Sub Ptb_Filter_Between(WshTrg As Worksheet, _ 
    sFldTrg As String, sFldDta As String, dFromVal As Double, dToValue As Double) 
Dim pTbl As PivotTable, pFldDta As PivotField 

    Rem Application Settings - OFF 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 

    Rem Set PivotTable 
    'Using Index 1 as OP confirmed there is only one PivotTable per Sheet 
    'If this condition change then PivotTable Index should be provided as an argument 
    Set pTbl = ActiveSheet.PivotTables(1) 
    With pTbl 

     Rem Set DataField - User provides the Data Field 
     For Each pFldDta In .DataFields 
      If pFldDta.SourceName = sFldDta Then Exit For 
     Next 
     If pFldDta Is Nothing Then GoTo ExitTkn 

     Rem Filter PivotField 
     .ClearAllFilters 'Use this line to clear all PivotTable Filters 
     On Error GoTo ExitTkn 
     With .PivotFields(sFldTrg) 
      .ClearAllFilters 'This line clears all PivotField Filters 
      .PivotFilters.Add2 Type:=xlValueIsBetween, _ 
       DataField:=pFldDta, Value1:=dFromVal, Value2:=dToValue 
    End With: End With 

ExitTkn: 
    Rem Application Settings - ON 
    Application.ScreenUpdating = True 
    Application.EnableEvents = True 

End Sub 

Вот некоторые образцы, как вызвать процедуру:

sFldTrg = "Type" 
sFldDta = "Amount" 
dFromVal = 25000 
dToValue = 30000 
    Call Ptb_Filter_Between(Worksheet Object, sFldTrg, sFldDta, dFromVal, dToValue) 

sFldTrg = "Type" 
sFldDta = "YTD%" 
dFromVal = 0.3 
dToValue = 0.35 
    Call Ptb_Filter_Between(Worksheet Object, sFldTrg, sFldDta, dFromVal, dToValue) 

sFldTrg = "Row" 
sFldDta = "YTD%" 
dFromVal = 0.1 'To set from value as 10% 
dToValue = 0.2 'To set to value as 20% 
    Call Ptb_Filter_Between(Worksheet Object, sFldTrg, sFldDta, dFromVal, dToValue) 
+0

. Большое спасибо @EEM. Это работает почти во всех случаях! Одно осложнение, которое я, похоже, не могу решить, - это то, где я создаю вычисленные поля/имена внутри самого скрипта (во время открытия рабочего листа). Тем не менее, я могу использовать свой альтернативный код в этих случаях! – MiguelH

+0

Рад, что он решил вашу проблему, однако странно, что вы сообщили о рассчитанных полях. Он должен работать с этим, когда я тестировал с вычисленными полями. Проверьте имя «PivotField», которое вы используете ... – EEM

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