2016-07-20 3 views
2

現在、ピボットテーブルのフィルタフィールドを置き換えるVBAコードがありますが、現在のExcelスプレッドシートには何百ものピボットテーブルがあるため、プロシージャが大きすぎるとVBAは機能しません。"プロシージャが大きすぎる"エラーを回避するための反復コードの省略

問題繰り返しの回数を減らす方法がわかりません。何らかの支援が確実に評価されます。以下

コード:

Private Sub Worksheet_Change(ByVal Target As Range) 
     If Intersect(Target, Range("P6:P7")) Is Nothing Then Exit Sub 

     Dim pt As PivotTable 
     Dim Field As PivotField 
     Dim NewCat As String 

     Set pt = Worksheets("Pivot Booking").PivotTables("PivotTable8") 
     Set Field = pt.PivotFields("Company Code") 
     NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

     With pt 
      Field.ClearAllFilters 
      Field.CurrentPage = NewCat 


     End With 

     Set pt = Worksheets("Pivot Booking").PivotTables("PivotTable6") 
     Set Field = pt.PivotFields("Company Code") 
     NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

     With pt 
      Field.ClearAllFilters 
      Field.CurrentPage = NewCat 


     End With 

     Set pt = Worksheets("Pivot Booking").PivotTables("PivotTable20") 
     Set Field = pt.PivotFields("Company Code") 
     NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

     With pt 
      Field.ClearAllFilters 
      Field.CurrentPage = NewCat 


     End With 

     Set pt = Worksheets("Pivot Booking").PivotTables("PivotTable7") 
     Set Field = pt.PivotFields("Company Code") 
     NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

     With pt 
      Field.ClearAllFilters 
      Field.CurrentPage = NewCat 


    'Keeps on repeating for about 200 more PivotTables in Various Sheets 

End With 

End Sub 
+1

会社コードにスライサーを使用してください。または少なくともそれを失敗するブックをピボットテーブルのすべてのループをループするforeachループを使用して値をセルp6に設定 –

答えて

1

あなたがそのシート上のすべてのピボットテーブルを変更する場合:

Private Sub Worksheet_Change(ByVal Target As Range) 

     If Intersect(Target, Range("P6:P7")) Is Nothing Then Exit Sub 

     Dim pt As PivotTable, NewCat As String, s 

     NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

     For Each s In Array("Pivot Booking", "Pivot Transaction", _ 
              "Pivot Level Segment") 

      For Each pt In Worksheets(s).PivotTables 
       With pt.PivotFields("Company Code") 
        .ClearAllFilters 
        .CurrentPage = NewCat 
       End With 
      Next pt 

     Next s 

End Sub 
+0

これをループして2枚のシートを追加するにはどうすればよいですか? (「ピボット・トランザクション」および「ピボット・レベル・セグメント」)? これまでは、コード全体を繰り返すことでサブをループしてみましたが、うまくいきませんでした。また、サブルーチンを作成しようとしましたが、それもうまくいきませんでした。 申し訳ありません - 私のVBA-fuは間違いなく傷ついていません。 – Lazarius

+0

私の更新を見てください(テストされていませんが、あなたはアイデアを得るでしょう) –

+0

'Application.EnableEvents = False'を最初に追加し、最後まで' True'に戻す方が安全でしょうか?あるいは、 'ClearAllFilters'メソッドと' CurrentPage'プロパティの設定は、同じワークシート上のピボットテーブル上で動作するときに 'Worksheet_Change'イベントを引き起こさないでしょうか? – user3598756

0

はあなたのすべてをありがとう - 働いている完全なコードは以下のとおりです:

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Intersect(Target, Range("P6:P7")) Is Nothing Then Exit Sub 

    Application.EnableEvents = False 

    On Error GoTo ErrorHandler 

    Dim pt As PivotTable, NewCat As String, s 

    NewCat = Worksheets("Trending&Benchmarking").Range("P6").Value 

    For Each s In Array("Pivot Booking", "Pivot Transaction", "Pivot Level Segment", "Pivot YoY TransactionGraph") 

     For Each pt In Worksheets(s).PivotTables 
      With pt.PivotFields("Company Code") 
       .ClearAllFilters 
       .CurrentPage = NewCat 
      End With 
     Next pt 

    Next s 

ErrorHandler: 

    Debug.Print Err.Number & vbNewLine & Err.Description 
    Resume ErrorExit 

ErrorExit: 

    Application.EnableEvents = True 

    Exit Sub 


End Sub 
関連する問題