引数の型が二つあるときは、仕方がないからバリアントで。
先日、テーブルのスライサーを作成する関数を作成してみた。
infoment.hatenablog.com
テーブルで作るなら、ピボットテーブルでも作れるようにしたい。
先日のコードがこちら。
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
いつもの悪い癖で、だんだん複雑になってきた。
明日に続きます。
参考まで。