【Excel VBA入門 第14回】省略できる引数を作る!~Optional引数とデフォルト値の使い方~

スポンサーリンク
Excel VBA

イントロダクション

前回(第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 Sub

Optional引数を使う際のルール

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 Function
Sub 呼び出し例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 関数を使ってその引数が実際に省略されたかどうかを判定できる(デフォルト値を設定していない場合に有効な手法である)。

なお、IntegerDouble などの単純なデータ型では、引数が省略されたことを IsMissing で判定することはできない。

Function サンプル(Optional メモ As Variant) As String
    If IsMissing(メモ) Then
        サンプル = "メモなし"
    Else
        サンプル = "メモ: " & メモ
    End If
End Function

数値や文字列型の引数にデフォルト値を設定できる場合は、IsMissing を使うよりもデフォルト値を指定する方がシンプルで分かりやすいコードになる。使い分けの目安として覚えておくとよい。

まとめ

今回は、引数を柔軟に扱うための Optional 引数を学んだ。

  • Optional を付けた引数は、呼び出し時に省略できる
  • Optional引数は必須引数よりも後ろに置く必要がある
  • = 値 でデフォルト値を指定できる
  • Variant 型かつデフォルト値がない場合は IsMissing で省略の有無を判定できる

引数の設計を工夫することで、呼び出す側のコードが読みやすく、使いやすい関数を作れるようになる。

次回(第15回)は、複数のデータをまとめて扱う「配列」を、Function・Subに渡したり受け取ったりする方法についてご紹介しよう。

コメント

タイトルとURLをコピーしました