プロシージャが省略可能なパラメーターを定義する場合、呼び出し元のコードがそれらに対応する引数を渡しているかどうかを確認する必要がある場合があります。
パラメーターの値が既定値に等しい場合は、次のいずれかの状況です。
呼び出し元のコードがプロシージャの呼び出しで引数を省略した
呼び出し元のコードがパラメーターの既定値に等しい値を引数として渡した
プロシージャ コードは、この 2 つの状況を区別できません。 これが問題にならない場合も多くありますが、この2 つのケースでプロシージャが別々のアクションを実行する場合も考えられます。 この対処法としては、あり得ない値を既定値として設定する方法が考えられますが、呼び出し元のコードが絶対にこの値を渡さないという保証はありません。
呼び出し元のプログラムが省略可能な引数を渡しているということを確実にする必要がある場合は、プロシージャのオーバーロードされたバージョンを定義するのが最も安全です。 詳細については、「方法: プロシージャの複数のバージョンを定義する (Visual Basic)」および「プロシージャのオーバーロードに関する注意事項 (Visual Basic)」を参照してください。
省略可能なパラメーターに引数が渡されたかどうかを確認するには
パラメーターの既定値に、あり得ない値を定義する
省略可能なパラメーターが String などの参照型の場合は、Nothing を既定値として使用できます。ただし、Nothing が引数の値として使用されることが予想される場合を除きます。
プロシージャ コード内で、パラメーターを既定値と比較して適切なアクションを実行します。
省略可能なパラメーターのあるものとないものでプロシージャをオーバーロードする
省略可能なパラメーターを持つプロシージャを定義するには、オーバーロードを使用する方法もあります。 省略可能なパラメーターが 1 つある場合は、パラメーターがあるバージョンとないバージョンの、2 つのオーバーロードされたバージョンのプロシージャを定義できます。 この方法は、省略可能なパラメーターの数が増えるにつれて複雑になります。 しかし、それぞれの省略可能な引数が呼び出しプログラムによって指定されているかどうかを確実に把握できるという利点があります。
引数の有無を確認するためにプロシージャの別バージョンを定義する
引数リスト内のパラメーターを含むバージョンのプロシージャを定義します。 パラメーターは Optional として宣言しません。
もう 1 つのバージョンはパラメーターなしで定義します。 宣言の他の部分は 1 つ目のバージョンと同一にします。
プロシージャの各バージョンに、呼び出しの種類に適したコードを配置します。
使用例
次のプロシージャでは、省略可能なパラメーター 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
呼び出しを行っているコードが引数リスト内の office に値を渡さなければ、Visual Basic が既定値 "QJZ" を渡します。
省略可能なパラメーターが String などの参照型の場合は、Nothing (Visual Basic) を既定値として使用できます。ただし、Nothing (Visual Basic) が引数の値として使用されることが予想される場合を除きます。
オーバーロードを使用して、省略可能なパラメーターが渡されているかどうかを確認する例については、「方法: 省略可能なパラメーターを受け取るプロシージャをオーバーロードする (Visual Basic)」を参照してください。
参照
処理手順
方法: プロシージャに対して省略可能なパラメーターを定義する (Visual Basic)
方法: 省略可能なパラメーターを受け取るプロシージャを呼び出す (Visual Basic)