2016-02-04 5 views
1

У меня есть 16 сводных таблиц, которые мне нужно обновить, когда пользователь нажимает кнопку. Код, который должен работать следующим образом:excel 2010 vava loop pivot tables

ActiveSheet.PivotTables("PivotTable10").PivotFields("count").ClearAllFilters 
     ActiveSheet.PivotTables("PivotTable10").PivotFields("scrap code").ClearAllFilters 
       ActiveSheet.PivotTables("PivotTable10").PivotFields("count").ShowAllItems = True 

     With ActiveSheet.PivotTables("PivotTable10").PivotFields("count") 
      .PivotItems("0").Visible = False 
     End With 

Названия сводных таблиц являются: MSP,MSP30,FSP,FSP30,MRP,MRP30,FRP,FRP30,MPP,MPP30,FPP,FPP30,MCP,MCP30,FCP,FCP30

Я хотел бы заменить PivotTable10 с переменной петлями через этот список сводных таблиц. Прямо сейчас мой код составляет 16 блоков кода выше. Я мало знаю о циклах, и я не нашел хороший пример этого типа цикла в моих поисковых системах.

EDIT: наконец-код, который работал, оба ответа ниже работали прекрасно, этот код просто работал немного быстрее

Sub IteratePivots() 

Application.ScreenUpdating = False 

On Error Resume Next 

Worksheets("Analytics Admin").Activate 

Dim pvtTables As PivotTables 
Dim pvtTable As PivotTable 
Set pvtTables = Application.ActiveSheet.PivotTables 
For Each pvtTable In pvtTables 
    pvtTable.PivotFields("count").ClearAllFilters 
    pvtTable.PivotFields("scrap code").ClearAllFilters 
    pvtTable.PivotFields("count").ShowAllItems = True 

    With pvtTable.PivotFields("count") 
     .PivotItems("0").Visible = False 
    End With 
Next 

Application.ScreenUpdating = False 
End Sub 
+0

Только имена Pivottable будут меняться в вашем коде, я прав? – Siva

+0

, что правильно, я буду запускать эти точные 4 строки каждый раз (возможно, мне придется добавить исправление ошибки, когда единственное значение равно 0). –

ответ

3

Попробуйте этот код. Этот код будет проходить через все поворотные на вашем листе.

Sub IteratePivots() 
Dim pvtTables As PivotTables 
Dim pvtTable As PivotTable 
Set pvtTables = Application.ActiveSheet.PivotTables 
For Each pvtTable In pvtTables 
    pvtTable.PivotFields("count").ClearAllFilters 
    pvtTable.PivotFields("scrap code").ClearAllFilters 
    pvtTable.PivotFields("count").ShowAllItems = True 

    With pvtTable.PivotFields("count") 
     .PivotItems("0").Visible = False 
    End With 
Next 
End Sub 
+0

спасибо, что это работает немного быстрее, чем код @hambones, как 6 секунд. –

2

Это немного рубить, но что-то подобное может на хитрость:

Dim pt As PivotTable 
    Dim ws As Worksheet 
    Dim names As Variant 
    Dim found As Boolean 

    Set ws = ActiveWorkbook.ActiveSheet 
    names = Split("MSP,MSP30,FSP,FSP30,MRP,MRP30,FRP,FRP30,MPP,MPP30,FPP,FPP30,MCP,MCP30,FCP,FCP30", ",") 

    For Each pt In ws.PivotTables 
    found = False 

    For i = 1 To UBound(names) 
     If pt.Name = names(i) Then 
     found = True 
     End If 
    Next i 

    If found Then 
     pt.PivotFields("count").ClearAllFilters 
     pt.PivotFields("scrap code").ClearAllFilters 
     pt.PivotFields("count").ShowAllItems = True 

     pt.PivotFields("count").PivotItems("0").Visible = False 
    End If 

    Next pt 

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

https://stackoverflow.com/a/10952705/190829

+0

это чертовски близко к тому, что я пытался сделать, единственные проблемы в том, что некоторые из значений сводных таблиц равны 0, и я получаю сообщение об ошибке «неспособное установить видимое свойство класса PivotItem». –

+0

@AlbertoBrown, В этом случае Проверьте, если значение <> 0, прежде чем продолжить. – Siva