ピボットテーブルの備忘録 ⑤独自のテーブルスタイル設定

先日から、マクロによるピボットテーブルの扱いを纏めている(備忘録)。
先日は、マクロによる集計フィールドの追加に挑戦した。
infoment.hatenablog.com

今日は、ちょっと寄り道。指定した範囲をテーブル化するために、まずオリジナルのテーブルスタイルをマクロで作成する。
f:id:Infoment:20200325220510j:plain

Excelには最初から、幾つかのスタイルが準備されている。
f:id:Infoment:20200325220942p:plain

これ以外にも、ユーザーで任意のスタイルを作成して設定可能だ。

今回は、任意のスタイルを作成するマクロを、先日からのクラスモジュールに追加してみよう。

ピボットテーブル作成用クラスモジュールに、テーブルに関する機能を付すことに迷いがある。何でも盛り込み過ぎれば、いわゆる「神のクラス」化する恐れがあるから。

でも今回は、難しいことは考えずに、取り敢えず追加してみた。

Public Function SetPersonalTableStyle() As TableStyle
    Dim TableStyle As Excel.TableStyle
    
    ' 作成済みの場合、エラーになる。
        On Error Resume Next
    Set TableStyle = ActiveWorkbook.TableStyles.Add("PersonalTableStyle01")
        If Err.Number <> 0 Then
            Set SetPersonalTableStyle = ActiveWorkbook.TableStyles("PersonalTableStyle01")
            Exit Function
        End If
        
    ' テーブルスタイルを表示して、選択可能にする。
        TableStyle.ShowAsAvailableTableStyle = True
        
    Dim ElementTypeIndex As Variant
    Dim BordersIndex As Variant
    
    ' 以下は個人的好みを反映したものであるため、任意に変更可。
    
    ' 全体と見出し行を設定。
        For Each ElementTypeIndex In Array(xlWholeTable, xlHeaderRow)
            With TableStyle.TableStyleElements.Item(ElementTypeIndex)
            
            ' 一旦すべての罫線を削除する。
                .Borders.LineStyle = xlNone
                .Borders(xlInsideHorizontal).LineStyle = xlNone
                .Borders(xlInsideVertical).LineStyle = xlNone
                
            ' 上下の罫線を設定。
                For Each BordersIndex In Array(xlEdgeTop, xlEdgeBottom)
                    With .Borders(BordersIndex)
                        .ThemeColor = xlThemeColorLight1
                        .TintAndShade = 0.5
                        .Weight = xlThin
                    End With
                Next
            End With
        Next
        
        ' 見出し行の塗りつぶし設定。
        With TableStyle.TableStyleElements.Item(xlHeaderRow)
            With .Interior
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = -0.05
            End With
        End With
        
        Set SetPersonalTableStyle = TableStyle
End Function

こちらで特徴的なのが、↓ 最近教わったこの個所。

For Each ElementTypeIndex In Array(xlWholeTable, xlHeaderRow)

例えば、1,2,4,5,11,14,22番目の何かに対して、繰り返し処理をしたいとする。繰り返しなのでFor Next構文を使いたいが、上記数群には何の法則も見出せない。あるかもしれないが、相当複雑な式になる恐れがある。そんな時は配列に入れたうえで、繰り返し処理すると便利だ。

↓ サンプル。

Sub hoge()
    Dim i As Variant
        For Each i In Array(1, 2, 4, 5, 11, 14, 22)
            Debug.Print i
        Next
End Sub

↓ 結果。
f:id:Infoment:20200325221914p:plain

今回作成したコードでは、

  • テーブル全体に対して
  • テーブルの見出し行について

のように任意の一部に対し同じ処理を行っていて、この方式にお世話になった。

結果、出来上がったスタイルを適用すると、こうなった。
f:id:Infoment:20200325222318p:plain

準備は整った。

明日に続きます。

参考まで。