イントロダクション
前回(第13回)では、引数の渡し方における ByVal(値渡し)と ByRef(参照渡し)の違いを学んだ。
今回は、複数の引数を扱う際に知っておきたい「Optional引数」をご紹介しよう。「基本的にはこの値を使うが、必要な時だけ変更したい」というケースで非常に役立つ機能である。
Optional引数とは
通常、Functionやプロシージャの引数は、呼び出す側で必ずすべて指定する必要がある。しかし Optional キーワードを使うと、その引数を省略可能にできる。
Function 消費税込み価格(価格 As Long, Optional 税率 As Double = 0.1) As Long
消費税込み価格 = 価格 * (1 + 税率)
End Functionこの例では、第2引数の 税率 に Optional を付けているため、省略した場合は自動的に 0.1(10%)が使われる。
Sub 呼び出し例()
Debug.Print 消費税込み価格(1000) ' 税率省略 → 1100
Debug.Print 消費税込み価格(1000, 0.08) ' 税率指定 → 1080
End SubOptional引数を使う際のルール
Optional引数を使う際には、いくつか押さえておくべきルールがある。
- Optional引数は、必須引数(Optionalを付けない引数)よりも後ろに置かなければならない
- デフォルト値(
= 0.1の部分)は省略可能。省略した場合は、型に応じた既定値(数値なら0、文字列なら空文字など)が使われる - 複数のOptional引数を並べることもできる
' NG例:Optionalの後に必須引数を置くことはできない
Function サンプル(Optional A As Long = 0, B As Long) As Long
End Function上記のようなコードはコンパイルエラーになるため、必ず「必須引数 → Optional引数」の順番で並べる必要がある。
複数のOptional引数を持つ実践例
割引計算を例に、複数のOptional引数を使ったFunctionを作ってみよう。
なお、コードは、第12回で作成した Module1 に引き続き追記していく。
Function 割引後価格(価格 As Long, _
Optional 割引率 As Double = 0, _
Optional 会員特典率 As Double = 0) As Long
割引後価格 = 価格 * (1 - 割引率 - 会員特典率)
End FunctionSub 呼び出し例2()
Debug.Print 割引後価格(10000) ' 割引なし → 10000
Debug.Print 割引後価格(10000, 0.1) ' 10%割引 → 9000
Debug.Print 割引後価格(10000, 0.1, 0.05) ' 10%割引+会員5%割引 → 8500
End Subこのように、状況に応じて「必要な分だけ引数を指定する」ことができるため、呼び出す側のコードがすっきりする。

IsMissing関数で省略の有無を判定する
Optional 引数を Variant 型で宣言した場合、IsMissing 関数を使ってその引数が実際に省略されたかどうかを判定できる(デフォルト値を設定していない場合に有効な手法である)。
なお、Integer や Double などの単純なデータ型では、引数が省略されたことを IsMissing で判定することはできない。
Function サンプル(Optional メモ As Variant) As String
If IsMissing(メモ) Then
サンプル = "メモなし"
Else
サンプル = "メモ: " & メモ
End If
End Function数値や文字列型の引数にデフォルト値を設定できる場合は、IsMissing を使うよりもデフォルト値を指定する方がシンプルで分かりやすいコードになる。使い分けの目安として覚えておくとよい。
まとめ
今回は、引数を柔軟に扱うための Optional 引数を学んだ。
Optionalを付けた引数は、呼び出し時に省略できる- Optional引数は必須引数よりも後ろに置く必要がある
= 値でデフォルト値を指定できるVariant型かつデフォルト値がない場合はIsMissingで省略の有無を判定できる
引数の設計を工夫することで、呼び出す側のコードが読みやすく、使いやすい関数を作れるようになる。
次回(第15回)は、複数のデータをまとめて扱う「配列」を、Function・Subに渡したり受け取ったりする方法についてご紹介しよう。


コメント