ピボットテーブルの備忘録 ② クラス化(2)フィールド

先日から、マクロによるピボットテーブルの扱いを纏めている(備忘録)。
昨日はクラスモジュールで、集計直前のピボットテーブルを作成した。
infoment.hatenablog.com
今日は、各フィールドをセットしてみる。
f:id:Infoment:20200314122418p:plain

↓ いつもの「なんちゃって個人情報」からデータ拝借。
f:id:Infoment:20200314122625p:plain

手動で作成する場合、以下4つの任意のフィールドに項目をセットする。
f:id:Infoment:20200314122801p:plain

例えば、↓ こんな感じだ。
f:id:Infoment:20200314122846p:plain

これら4つのフィールドは、VBAでは次のように指定する。
docs.microsoft.com

具体的には、こちらのとおり。

  1. xlPageField :フィルター
  2. xlRowField  :行
  3. xlColumnField:列
  4. xlDataField :値
クラスモジュール(PvtTable)

以上を踏まえ、昨日のクラスモジュールに以下を追加した。

' 各フィールドの設定。
Public Sub SetFields(field_orientation As XlPivotFieldOrientation, _
                     ParamArray field_names())
    
    ' ピボットテーブルの作成済み確認。
    If Pvt Is Nothing Then Exit Sub
    
    ' フィールドをセット。
    ' field_orientationの内訳は下記のとおり。
    ' ① xlPageField :フィルター
    ' ② xlRowField  :行
    ' ③ xlColumnField:列
    ' ④ xlDataField :値
    
    ' フィルターはセットした順に位置が下になるので、指定した
    ' フィールド名の最後から逆順でセットする。
    Dim i As Long
        Select Case field_orientation
            
            Case xlPageField
                For i = UBound(field_names) To 0 Step -1
                    Pvt.PivotFields(field_names(i)).Orientation = field_orientation
                Next
            
            Case Else
                For i = 0 To UBound(field_names)
                    Pvt.PivotFields(field_names(i)).Orientation = field_orientation
                Next
        
        End Select
End Sub


例えば今回のなんちゃって個人情報で「都道府県」を指定する場合、

  • ラベル名:"都道府県" で指定
  • テーブルの列番号:9で指定

のどちらでも可能だ。

それでは、テストしてみよう。

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

結果は、以下のとおり。
f:id:Infoment:20200314123833g:plain

明日に続きます。

参考まで。