ピボットテーブルの絞り込みに便利な「スライサー」ですが、月次レポートなどで毎回同じ項目を選び直すのは手間がかかります。実はスライサーの選択状態はVBAから直接操作できるため、「今月の支店だけを自動で選択する」「ボタン1つで全スライサーをリセットする」といった処理を組み込むことが可能です。
この記事では、既存スライサーの選択項目を切り替える方法から、複数スライサーの一括リセット、VBAでの新規作成まで解説します。
スライサーとは
スライサーは、ピボットテーブルやExcelテーブル(ListObject)のデータを、ボタンをクリックするだけで視覚的に絞り込める機能です。VBAではSlicerCache(スライサーの元になる設定)とSlicer(シート上に配置される見た目の部品)という2つのオブジェクトで管理されています。
選択項目の切り替えは、SlicerCache配下のSlicerItemsコレクションを操作することで行います。
既存のスライサーを取得する
スライサー名は、シート上のスライサーを選択した際に表示される名前(既定では「スライサー_列名」)で取得します。
Sub ShowSlicerNames()
Dim sc As SlicerCache
For Each sc In ThisWorkbook.SlicerCaches
Debug.Print sc.Name
Next sc
End Sub
イミディエイトウィンドウに表示された名前を使って、対象のスライサーをSlicerCaches("名前")で指定します。
特定の項目だけを選択状態にする
「支店名」のスライサーから「東京支店」だけを選択し、他の支店を除外する例です。
Sub SelectSlicerItem()
Dim sc As SlicerCache
Dim si As SlicerItem
Dim targetItem As String
targetItem = "東京支店"
Set sc = ThisWorkbook.SlicerCaches("スライサー_支店名")
For Each si In sc.SlicerItems
si.Selected = (si.Name = targetItem)
Next si
End Sub
SlicerItemsの各項目に対して、名前がtargetItemと一致する場合だけSelected = Trueにしています。一致しない項目は自動的にFalse(除外)になるため、結果として「東京支店」のみが選択された状態になります。
複数の項目を選択する
支店名スライサーで「東京支店」と「大阪支店」の2つを選択したい場合は、Select Caseで対象項目を判定します。
Sub SelectMultipleSlicerItems()
Dim sc As SlicerCache
Dim si As SlicerItem
Set sc = ThisWorkbook.SlicerCaches("スライサー_支店名")
For Each si In sc.SlicerItems
Select Case si.Name
Case "東京支店", "大阪支店"
si.Selected = True
Case Else
si.Selected = False
End Select
Next si
End Sub
条件に一致する項目名をCaseに列挙するだけなので、選択したい支店が増えてもコードの変更箇所はCaseの行だけで済みます。
複数のスライサーを一括でリセットする
複数のスライサーが連動しているレポートで、すべての絞り込みを一度に解除する例です。
Sub ResetAllSlicers()
Dim sc As SlicerCache
For Each sc In ThisWorkbook.SlicerCaches
sc.ClearManualFilter
Next sc
End Sub
ClearManualFilterメソッドを呼び出すと、そのスライサーの選択状態がすべて解除され、全項目が選択されている初期状態に戻ります。「絞り込みをリセット」ボタンのクリックイベントに登録しておくと便利です。
VBAでスライサーを新規作成する
ピボットテーブルに対して、コードからスライサーを新規追加することもできます。
Sub AddSlicerToPivot()
Dim pt As PivotTable
Dim sc As SlicerCache
Dim sl As Slicer
Set pt = Worksheets("集計").PivotTables("ピボットテーブル1")
Set sc = ActiveWorkbook.SlicerCaches.Add2(pt, "支店名")
Set sl = sc.Slicers.Add( _
SlicerDestination:=Worksheets("集計"), _
Name:="支店名スライサー", _
Caption:="支店名", _
Top:=20, _
Left:=300, _
Width:=200, _
Height:=150)
End Sub
SlicerCaches.Add2の第2引数にピボットテーブルのフィールド名を指定してキャッシュを作成し、Slicers.Addで実際にシート上へ配置しています。Top・Left・Width・Heightで表示位置とサイズを指定できます。
よくあるエラーと対処法
- 「実行時エラー1004(メンバーが見つかりません)」になる:
SlicerCaches("名前")に指定した名前が実際のスライサー名と一致していません。ShowSlicerNamesのようなコードで正確な名前を確認してください Selected = Falseにしたら全項目が消えてしまう:スライサーは最低1項目が選択されている必要があります。全項目をFalseにする処理は書かず、必ずどれか1つ以上をTrueにする設計にしてくださいAdd2が使えずAddしか候補に出ない:古いExcelバージョンやテーブル(ListObject)向けにスライサーを追加する場合はSlicerCaches.Add2(ListObject, "列名")のように第1引数をListObjectに変えて対応します
まとめ
スライサーの選択状態はSlicerCacheのSlicerItemsコレクションを操作することで、VBAから自由に制御できます。
SlicerItemsをループし、Selectedプロパティで項目ごとの選択・除外を切り替えるClearManualFilterで、そのスライサーの絞り込みを一括リセットできるSlicerCaches.Add2とSlicers.Addで、コードから新規スライサーを配置することも可能
月次レポートで「今月の対象支店だけを自動選択する」といった処理を組み込めば、レポート作成の手間を大きく減らせます。


コメント