引数の型が二つあるときは、仕方がないからバリアントで。

先日、テーブルのスライサーを作成する関数を作成してみた。
infoment.hatenablog.com

テーブルで作るなら、ピボットテーブルでも作れるようにしたい。
f:id:Infoment:20200409220529j:plain

先日のコードがこちら。

Function AddedSlicer(source_table As ListObject, _
                     target_label As String, _
                     destination_sheetname As String) As Excel.Slicer
    Dim Sh As Worksheet
    Set Sh = Sheets(destination_sheetname)
    
    Set AddedSlicer = ActiveWorkbook.SlicerCaches.Add2(source_table, _
                    target_label).Slicers.Add(Sh, , target_label, target_label)
End Function

 
↓ の部分を、PivotTableも受け取れるようにしたい。

source_table As ListObject

 
しかし、一つの変数で二つの型を宣言することはできない。
仕方ない、Variant型で一旦受け取ったものの型のタイプで、
処理を分岐させることにしよう。

Function AddedSlicer(source As Variant, _
                     target_label As String, _
                     destination_sheetname As String) As Excel.Slicer
    Dim Sh As Worksheet
    Set Sh = Sheets(destination_sheetname)

    Dim SourceTable As Variant
        Select Case TypeName(source)
            
            ' テーブルまたはピボットテーブルの場合、そのまま受け取る。
            Case "ListObject", "PivotTable"
                Set SourceTable = source
                
            ' 範囲の場合、当該範囲に設定されたテーブルまたはピボット
            ' テーブルを変数にセットする。
            Case "Range"
            
                ' ピボットテーブルの場合。
                If Not source.PivotTable Is Nothing Then
                    Set SourceTable = source.PivotTable
                    
                ' テーブルの場合。
                ElseIf Not source.ListObject Is Nothing Then
                    Set SourceTable = source.ListObject
                End If
            
            ' それ以外の場合は、Nothingのままとする。
            Case Else
                Exit Function
        End Select

    Set AddedSlicer = ActiveWorkbook.SlicerCaches.Add2(SourceTable, _
                      target_label).Slicers.Add(Sh, , target_label, target_label)
End Function

いつもの悪い癖で、だんだん複雑になってきた。

明日に続きます。

参考まで。