ピボットテーブルの備忘録 ③フィルター設定

先日から、マクロによるピボットテーブルの扱いを纏めている(備忘録)。
先日は、普段使用する書式をクラスモジュール内で一まとめにメソッド化することで、実際使用する際のコードを圧縮してみた。
infoment.hatenablog.com

今日は作成したピボットテーブルに、フィルターを設定してみる。
f:id:Infoment:20200322165451p:plain

方法としては単純で、指定した文字を含むものを、For Each の繰り返し構文で愚直に表示または非表示化するだけ。

' フィルター設定。
Public Sub SetFilter(page_fields As Variant, _
                     criteria As String, _
            Optional item_visible As Boolean = True)
    
    ' フィルターで複数選択を可とする。
    Pvt.PivotFields(page_fields).EnableMultiplePageItems = True
    For Each PvtItem In Pvt.PageFields(page_fields).PivotItems
        If PvtItem.Name Like "*" & criteria & "*" Then
            PvtItem.Visible = item_visible
        Else
            PvtItem.Visible = Not item_visible
        End If
    Next
End Sub

ポイントは、

Not item_visible

で、表示 ⇔ 非表示を反転させている点だろうか。
item_visibleはTrueまたはFalseであるため、

  • Not True ⇒ False
  • Not False ⇒ True

となる。

それでは、先日のピボットテーブルに

  1. 「カレーの食べ方」は、「せき止め」を含む場合を表示する。
  2. 「キャリア」は「au」を含む場合を表示しない。

の条件を追加してみよう。

ついでに、クラスモジュールをWithステートメントで初期化する方式で、コードをさらに短くしてみた。

Sub Test()
    With New VBAProject.PvtTable
        If .MakePivotTable(ActiveSheet.ListObjects(1)) = False Then
            MsgBox "ピボットテーブルの作成に失敗しました。"
            Exit Sub
        Else
            ' 各フィールドを設定。
            .SetFields xlPageField, "カレーの食べ方", "キャリア"
            .SetFields xlRowField, "都道府県", "性別"
            .SetFields xlColumnField, "婚姻"
            .SetFields xlDataField, 6
            
            .SetFilter "カレーの食べ方", "せき止め", True
            .SetFilter "キャリア", "au", False
            
            .SetFavoriteFormat
        End If
    End With
End Sub

結果は ↓ こちら。
f:id:Infoment:20200323211911g:plain

明日に続きます。

参考まで。