
Excelの関数は、引数の前にOptionalを付ければ、その引数を省略可能にすることが出来ます。
例えば、こんな感じですね。
この時に、関数「test」側でpFlagが省略されたのか、設定されたのか判断したいことがあります。
そんな時には、IsMissing関数を使用します。
この関数は、引数が設定されなかった場合にTrueを返します。
使い方は、こんな感じ。
ただし、この関数はVariant型での判定しか出来ません。
Excelのヘルプによると「引数が指定されたかどうかを判断するためのフラグが提供できないためです」と書いてる。
実際に、他の型で省略可能の引数を使ってみると...
これで、aaaを実行するとこうなります。

String型の場合は空白、Integer型の場合は0になります。
ようするに初期値ですよね。
なので、これらの型で引数省略の判定をしたい場合は、こうします。
関数側で、呼出側で設定されない値を初期値として設定しておいて、もし初期値のままだったら省略されたものとみなすようにします。
※ 書いておいてなんですが、完全性に欠けるので個人的には好きじゃないです。
なので、実際にはこういう使い方をしたことは無いです。
スポンサードリンク
例えば、こんな感じですね。
'関数「test」
Function test(Optional ByRef pFlag) As Boolean
If CStr(pFlag) = "1" Then
MsgBox "1"
Else
MsgBox "2"
End If
End Function
'関数「test」を実行する処理
Sub aaa()
'関数「test」を引数を省略して実行
test
'関数「test」に引数を設定して実行
test("1")
End Sub
この時に、関数「test」側でpFlagが省略されたのか、設定されたのか判断したいことがあります。
そんな時には、IsMissing関数を使用します。
この関数は、引数が設定されなかった場合にTrueを返します。
使い方は、こんな感じ。
Function test(Optional ByRef pFlag) As Boolean
If IsMissing(pFlag) Then
MsgBox "省略されました"
Else
MsgBox "設定されました"
End If
End Function
ただし、この関数はVariant型での判定しか出来ません。
Excelのヘルプによると「引数が指定されたかどうかを判断するためのフラグが提供できないためです」と書いてる。
実際に、他の型で省略可能の引数を使ってみると...
'引数省略のテスト関数
Function test(Optional ByRef pStr As String, Optional ByRef pInt As Integer) As Boolean
MsgBox "[" & pStr & "] / [" & pInt & "]"
End Function
'引数省略関数「test」を実行する処理
Sub aaa()
test
End Sub
これで、aaaを実行するとこうなります。

String型の場合は空白、Integer型の場合は0になります。
ようするに初期値ですよね。
なので、これらの型で引数省略の判定をしたい場合は、こうします。
'引数省略の確認関数
Function test(Optional ByRef pStr As String = "A", Optional ByRef pInt As Integer = -32768) As Boolean
If pStr = "A" Then
MsgBox "引数「pStr」が省略されました。"
End If
If pInt = -32768 Then
MsgBox "引数「pInt」が省略されました。"
End If
End Function
関数側で、呼出側で設定されない値を初期値として設定しておいて、もし初期値のままだったら省略されたものとみなすようにします。
※ 書いておいてなんですが、完全性に欠けるので個人的には好きじゃないです。
なので、実際にはこういう使い方をしたことは無いです。
スポンサードリンク


