2015-07-22 3 views
1
Set Weight_wb = Application.Workbooks(WEIGHTFileName).Sheets("TERRY_CAT") 
Set pt = Weight_wb .PivotTables("PivotTable4") 


With Weight_wb .PivotTables("PivotTable4").PivotFields("Cat") 
    .Orientation = xlColumnField 
    .Position = 1 
End With 
With Weight_wb .PivotTables("PivotTable4").PivotFields("Cat") 
    .Orientation = xlColumnField 
    On Error Resume Next 
    .PivotItems("black").Visible = True 
    .PivotItems("yellow").Visible = False 
    .PivotItems("brown").Visible = False 
    .Position = 1 
End With 

Я хочу изменить приведенный выше код, чтобы быть более гибким. Я хочу написать более общую суб SetClolumnFilter, так что я могу просто позвонить:excel VBA фильтр с поворотным столом с гибкими именами

SetColumnFilter WEIGHTFileName, "Terry_cat", "PivotTable4", "CAT","black" 

что-то вроде (это не работает):

Sub SetPageFilter(WB As String, WS As String, pt As String, fd As String,value as string) 
Dim wb_ As Workbook, ws_ As Worksheet, pt_ As PivotTable, fd_ As PivotField 

ws_ = Application.Workbooks(WB).Sheets(WS) 
pt_ = ws_.PivotTables(pt) 
fd_ = pt_.PivotFields(fd) 
With fd_ 
.Orientation = xlPageField 
End With 
Application.ScreenUpdating = True 

Dim i As Long 

     .PivotItems(1).Visible = True 
     For i = 2 To Field.PivotItems.Count 
      If .PivotItems(i).Name = Value Then _ 
       .PivotItems(i).Visible = True Else _ 
       .PivotItems(i).Visible = False 
     Next i 
End Sub 

Спасибо большое !!

+0

'это не работает' не является полезным описанием проблемы. Как это не работает? Выдает ли ошибка? Если да, то какая строка? Если нет ошибки, как код не дает результат, который вы ищете? Одна вещь, о которой нужно знать, состоит в том, что в наборе 'PivotItems' должен быть хотя бы один видимый элемент. Это всегда сложно, когда вы повторяете их, потому что не обязательно известно, какие из них скрыты/видимы. Сначала вы можете заставить их всех видиться, а затем запустить свой код, чтобы скрыть их все, кроме одного, если это проблема. –

ответ

0
Sub SetPageFilter(WB As String, WS As String, pt As String, fd As String,value as string) 
Dim wb_ As Workbook, ws_ As Worksheet, pt_ As PivotTable, fd_ As PivotField 

ws_ = Application.Workbooks(WB).Sheets(WS) 
pt_ = ws_.PivotTables(pt) 
fd_ = pt_.PivotFields(fd) 
With fd_ 
    .Orientation = xlPageField 
End With 
Application.ScreenUpdating = True 

Dim i As Long 

    With fd_ 
     .PivotItems(.PivotItems.Count).Visible = True 
     For i = 1 To .PivotItems.Count 
      If .PivotItems(i).Name = Value Then _ 
       .PivotItems(i).Visible = True Else _ 
       .PivotItems(i).Visible = False 
     Next I 
    End With 
End Sub