【ExcelVBA・マクロ】スライサーをVBAで操作する方法|ピボットテーブルの絞り込みを自動化する【コピペOK】

ExcelVBA

ピボットテーブルの絞り込みに便利な「スライサー」ですが、月次レポートなどで毎回同じ項目を選び直すのは手間がかかります。実はスライサーの選択状態は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で実際にシート上へ配置しています。TopLeftWidthHeightで表示位置とサイズを指定できます。

よくあるエラーと対処法

  • 「実行時エラー1004(メンバーが見つかりません)」になるSlicerCaches("名前")に指定した名前が実際のスライサー名と一致していません。ShowSlicerNamesのようなコードで正確な名前を確認してください
  • Selected = Falseにしたら全項目が消えてしまう:スライサーは最低1項目が選択されている必要があります。全項目をFalseにする処理は書かず、必ずどれか1つ以上をTrueにする設計にしてください
  • Add2が使えずAddしか候補に出ない:古いExcelバージョンやテーブル(ListObject)向けにスライサーを追加する場合はSlicerCaches.Add2(ListObject, "列名")のように第1引数をListObjectに変えて対応します

まとめ

スライサーの選択状態はSlicerCacheSlicerItemsコレクションを操作することで、VBAから自由に制御できます。

  • SlicerItemsをループし、Selectedプロパティで項目ごとの選択・除外を切り替える
  • ClearManualFilterで、そのスライサーの絞り込みを一括リセットできる
  • SlicerCaches.Add2Slicers.Addで、コードから新規スライサーを配置することも可能

月次レポートで「今月の対象支店だけを自動選択する」といった処理を組み込めば、レポート作成の手間を大きく減らせます。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました