プロシージャを呼び出すときに、プロシージャ パラメーターが省略可能であり、引数を指定する必要がないことを指定できます。
省略可能なパラメーター は、プロシージャ定義の Optional
キーワードによって示されます。 次の規則が適用されます。
プロシージャ定義内のすべての省略可能なパラメーターでは、既定値を指定する必要があります。
省略可能なパラメーターの既定値は定数式である必要があります。
プロシージャ定義で省略可能なパラメーターに続くすべてのパラメーターも省略可能である必要があります。
次の構文は、省略可能なパラメーターを持つプロシージャ宣言を示しています。
Sub name(ByVal parameter1 As datatype1, Optional ByVal parameter2 As datatype2 = defaultvalue)
省略可能なパラメーターを使用したプロシージャの呼び出し
省略可能なパラメーターを指定してプロシージャを呼び出すときに、引数を指定するかどうかを選択できます。 そうでない場合、プロシージャはそのパラメーターに対して宣言された既定値を使用します。
引数リストで 1 つ以上の省略可能な引数を省略すると、連続するコンマを使用して位置をマークします。 次の呼び出し例は、1 番目と 4 番目の引数を指定しますが、2 番目または 3 番目の引数は指定しません。
Sub name(argument 1, , , argument 4)
次の例では、 MsgBox
関数を複数呼び出します。
MsgBox
には、1 つの必須パラメーターと 2 つの省略可能なパラメーターがあります。
MsgBox
の最初の呼び出しでは、3 つの引数をすべて、MsgBox
定義した順序で指定します。 2 番目の呼び出しでは、必要な引数のみが提供されます。 3 番目と 4 番目の呼び出しでは、1 番目と 3 番目の引数が指定されます。 3 番目の呼び出しは位置によってこれを行い、4 番目の呼び出しでは名前で行います。
MsgBox("Important message", MsgBoxStyle.Critical, "MsgBox Example")
MsgBox("Just display this message.")
MsgBox("Test message", , "Title bar text")
MsgBox(Title:="Title bar text", Prompt:="Test message")
省略可能な引数が存在するかどうかを判断する
プロシージャは、特定の引数が省略されたか、呼び出し元のコードが既定値を明示的に指定したかを実行時に検出できません。 この区別を行う必要がある場合は、ありそうもない値を既定値として設定できます。 次の手順では、省略可能なパラメーター office
を定義し、その既定値 QJZ
をテストして、呼び出しで省略されているかどうかを確認します。
Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
If office = "QJZ" Then
Debug.WriteLine("office not supplied -- using Headquarters")
office = "Headquarters"
End If
' Insert code to notify headquarters or specified office.
End Sub
省略可能なパラメーターが String
などの参照型の場合は、引数に予期される値でない場合は、既定値として Nothing
を使用できます。
省略可能なパラメーターとオーバーロード
省略可能なパラメーターを持つプロシージャを定義するもう 1 つの方法は、オーバーロードを使用することです。 省略可能なパラメーターが 1 つある場合は、2 つのオーバーロードされたバージョンのプロシージャを定義できます。1 つはパラメーターを受け入れ、1 つはパラメーターを受け取らずに定義します。 この方法は、省略可能なパラメーターの数が増えるにつれて、より複雑になります。 ただし、その利点は、呼び出し元のプログラムが各省略可能な引数を指定したかどうかを絶対に確認できることです。
こちらも参照ください
.NET