社内SEの徒然なる日記

Excel関数で引数を省略できる関数を使ってみる

Excelの関数は、引数の前にOptionalを付ければ、その引数を省略可能にすることが出来ます。
例えば、こんな感じですね。

'関数「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を実行するとこうなります。
WS001008.jpg

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


関数側で、呼出側で設定されない値を初期値として設定しておいて、もし初期値のままだったら省略されたものとみなすようにします。

※ 書いておいてなんですが、完全性に欠けるので個人的には好きじゃないです。
  なので、実際にはこういう使い方をしたことは無いです。
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する