省略可能なオブジェクト型引数のデフォルト値

省略可能なオブジェクト型の引数のデフォルト値

省略可能な引数

プロシージャに省略可能な引数を設定するときには、

Public Sub hogeHoge(Optional ByVal foo As String = "ち~んw")

というふうに書く。

引数名の指定の最初に「Optionalキーワード」を付けて省略可能であることを示し、最後に「 = ~~」の形でデフォルト値を設定することができる。

ここまではまあ、たいていの人が知っているだろう。

じゃ、引数がオブジェクト型だったらどうすんのさ?

普通に書いてみる

とりあえず、

akashi-keirin.hatenablog.com

前回作成したFunctionはWorksheetオブジェクトが引数だったので、こいつを使う。

引数指定がない場合は、アクティブシートを渡す、という形にする。

まず、プロシージャの宣言の部分を

Public Function isAutoFiltered(Optional ByVal targetSheet As Worksheet = ActiveSheet) As Boolean

と書いてみる。

とりあえず、逐次コンパイルには引っかからない。

しかし、実行すると、

f:id:akashi_keirin:20180301081757j:plain

コンパイルエラーwww

ま、当たり前ですけどね。

Public Function isAutoFiltered( _
                  Optional ByVal targetSheet As Worksheet Set targetSheet = ActiveSheet) _
                    As Boolean

こうも書いてみたけれど、これはもう逐次コンパイルに引っかかるレベルでダメw

結局、次のようになった。

リスト1
Public Function isAutoFiltered(Optional ByVal targetSheet As Worksheet) As Boolean
  If targetSheet Is Nothing Then Set targetSheet = ActiveSheet
  If targetSheet.AutoFilter.FilterMode Then isAutoFiltered = True
End Function

引数が省略されると、targetSheetがNothingになるので、プロシージャの先頭でActiveSheetをセットするようにしただけ。

おわりに

先頭のカッコ内(引数指定のところ)でデフォルト値を設定する方法もあるのだろうか???

@akashi_keirin on Twitter