2016-02-01 28 views
0

У меня есть отчет, который проходит и меняет различные поля поворота и копирует некоторые данные на другой лист. Я сделал макрос для него, который работает, но это, по сути, результаты моих кликов. Я хотел бы написать подраздел, который я могу передать в сводной таблице, сводном поле и имени элемента управления и обновить поля таким образом, а не копировать и вставлять действия снова и снова. Вот один его фрагмент, который устанавливает три фильтра в сводной таблице.vba update pivot items

`Worksheets("Closed Pivot").Activate 
With ActiveSheet.PivotTables("PivotTable5").PivotFields("Business") 
     .PivotItems("NEW").Visible = True 
     .PivotItems("Pre-Paid Maint").Visible = False 
     .PivotItems("Renewal").Visible = False 
     .PivotItems("Training/Pro Svc").Visible = False 
     .PivotItems("Upsell/Cross-sell").Visible = False 
     .PivotItems("(blank)").Visible = False 
     .PivotItems("#N/A").Visible = False 
    End With 
      ActiveSheet.PivotTables("PivotTable5").PivotFields("Stage"). _ 
     EnableMultiplePageItems = True 
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Revenue Channel") 
     .PivotItems("2-Tier Distributor").Visible = True 
     .PivotItems("Direct Sales").Visible = True 
     .PivotItems("Direct VAR").Visible = True 
     .PivotItems("Ecommerce").Visible = True 
     .PivotItems("Maintenance Renewal").Visible = True 
     .PivotItems("(blank)").Visible = True 
    End With 

    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Stage") 
     .PivotItems("Closed Lost").Visible = False 
     .PivotItems("Closed Won").Visible = True 
     .PivotItems("(blank)").Visible = False 
    End With` 
+0

Вы действительно хотите передавать объекты PivotTable, PivotField и PivotItem или вы хотите ссылаться на них по имени? Кроме того, как вы намерены передавать эти переменные? Из пользовательского интерфейса или через VBA? Другими словами, где вы получаете ввод для рутины, в которой вы нуждаетесь? Подсказка: ваш собственный вопрос уже говорит о необходимости: 'Sub FilterPivot (pt as PivotTable, pf as PivotField, pi как PivotItem)' или альтернативно 'Sub FilterPivot (ptStr как строка, pfStr как строка, piStr как строка)' –

+0

моя оригинальная мысль должен был передать их по значению и вызвать их в коде vba, так как после того, как это будет сделано, он будет работать одинаково, но я не знаю, будет ли лучше работать только ссылки. –

+0

Ну, это не имеет большого значения. Вопрос заключается в том, хотите ли вы сами передавать сами сводные данные (поскольку они являются объектами, ByVal или ByRef не имеет значения, поскольку VBA все равно будет передавать ссылку) или строки, которые будет использоваться подпрограммой, чтобы найти соответствующие значения, поля и т. Д. Пожалуйста, покажите мне, что вы запрограммировали до сих пор над записанным образцом выше, и я постараюсь изо всех сил помочь вам. –

ответ

0

Существует два варианта: либо вы передаете имена PivotTables, поля и элементы как строки к югу, или передать сами объекты. При переходе имена как строки:

Sub FilterPivotByNames(wsStr as string, ptStr as string, pfStr as string, piStr as string) 
Dim ws as Worksheet 
Dim pt as PivotTable 
Dim pf as PivotField 
Dim pi as PivotItem 

Set ws = Worksheets(wsStr) 
Set pt = ws.PivotTables(ptStr) 
Set pf = pt.PivotFields(pfStr) 

With pf 
    For each pi in pf.PivotItems 
     If pi.name = piStr Then 
      pi.Visible = True 
     Else 
      pi.Visible = False 
     End If 
    Next pi 
End With 

End Sub 

Использование:

Sub test() 
FilterPivotByNames "Sheet1", "PivotTable5", "Stage", "Closed Won" 'Just send the names as parameters; the FilterPivotByNames routine knows how to find the appropriate object. 
End Sub 

При прохождении сами объекты:

Sub FilterPivotByObject(pt as PivotTable, pf as PivotField, pi as PivotItem) 
Dim pItem as PivotItem 
For each pItem in pt.pf.PivotItems 
    If pItem = pi then 
     pItem.visible = True 
    Else 
     pItem.visible = False 
    End If 
End Sub 

Использование:

Sub test2() 
Dim pt as PivotTable 
Dim pf as PivotField 
Dim pi as PivotItem 
Set pt = Worksheets("Sheet1").PivotTables("PivotTable5") 
Set pf = pt.PivotFields("Stage") 
Set pi = pf.PivotItem("Closed Won") 
FilterPivotByObject(pt, pf, pi) 'In this scenario we first make sure we have the pivottables in variables and use those as the parameters, instead of just the names. 
End Sub 

Вы могли бы хотеть Expan d для них для многозначных фильтров и т. д. Также может быть некоторая обработка ошибок в зависимости от того, кто будет использовать подсистемы. Неожиданные значения приведут к ошибкам (например, когда PivotTable5 на Worksheet1 не существует)