VBAでは、Sub/Functionプロシージャの引数に「Optional」キーワードというものを使用すると、プロシージャを呼び出す際に、その引数を省略することができます。
また、引数を省略した際に、その引数にデフォルト値を設定することもできます。
例を挙げてご説明いたします。
Optionalキーワードの使用方法
例として、引数に価格と税率を指定すると、税込み価格を返す関数(Functionプロシージャ)を作ってみます。
プロシージャの定義方法
Function GetTaxIncludedPrice(Price As Long, Optional TaxRate As Single) As Long
GetTaxIncludedPrice = Price * (1 + TaxRate)
End Function
このように、第2引数の「TaxRate」(税率)の前に「Optional」キーワードを付けると、何も設定しなくても、関数を呼び出すことができます。
プロシージャの呼び出し方法(引数を指定する例)
まずは、普通に引数を指定して、Functionプロシージャを使用する例です。
MsgBox GetTaxIncludedPrice(100, 0.1)
結果は「110」が返ってきます。
プロシージャの呼び出し方法(引数を省略する例)
次に、第2引数を省略して、Functionプロシージャを使用する例です。
MsgBox GetTaxIncludedPrice(100)
Functionプロシージャの呼び出し元で、第2引数の「TaxRate」が省略されたため、「TaxRate」が属性初期値である「0」として処理が行われて、結果として「100」が返ってきます。
Optionalを付けた引数にデフォルト値を設定する方法
以下のようにすると、引数が省略された場合のデフォルト値を設定できます。
プロシージャの定義方法
Function GetTaxIncludedPrice(Price As Long, Optional TaxRate As Single = 0.1) As Long
GetTaxIncludedPrice = Price * (1 + TaxRate)
End Function
このように、「Optional」キーワードを付けた第2引数の「TaxRate」の後ろに「=0.1」のように値を付けると、デフォルト値を設定できます。
プロシージャの呼び出し方法(引数を指定する例)
普通に引数を指定する場合は、Functionプロシージャの呼び出し方法は変わりません。
MsgBox GetTaxIncludedPrice(100, 0.08)
結果は「108」が返ってきます。
プロシージャの呼び出し方法(引数を省略する例)
次に、第2引数を省略した場合の例です。
MsgBox GetTaxIncludedPrice(100)
Functionプロシージャの呼び出し元で、第2引数の「TaxRate」が省略されたため、「TaxRate」は、デフォルト値として設定された「0.1」として処理が行われて、結果として「110」が返ってきます。
Optionalキーワードの便利な用途
「既存のプロシージャに新たな機能を追加したい。そのために引数を追加したいが、プロシージャの呼び出し元を修正するのが大変である。」といった場合に、Optionalキーワードが便利です。
例えば、上記の説明で使用した「GetTaxIncludedPrice」関数に、「処理区分を追加して、税額のみを返す機能を付け加えたい」とします。
このような場合には、既存の「GetTaxIncludedPrice」関数を以下のように修正すれば、
- 既存の呼び出し元では処理区分が指定されないため、現行通り税込み価格を返す
- 新規処理では処理区分を指定して税額のみを返す
といったことが可能です。
Function GetTaxIncludedPrice(Price As Long, Optional TaxRate As Single = 0.1, Optional ExecMode As Integer = 0) As Long
If ExecMode = 0 Then
GetTaxIncludedPrice = Price * (1 + TaxRate)
Else
GetTaxIncludedPrice = Price * TaxRate
End If
End Function
補足事項
- 上記の例の通り、Optionalキーワードは複数指定可能です。
「第2引数を省略して、第3引数のみ指定したい」といった場合は、以下のようにプロシージャを呼び出せば対応可能です。
GetTaxIncludedPrice(100, , 1) - 当記事では、戻り値を返す「Functionプロシージャ」を例に説明しましたが、戻り値を返さない「Subプロシージャ」でも、同様にOptionalキーワードを使用できます。
コメント