Excel VBA | IsMissing と Optional の細かい制約(Variant の場合)

Excel VBA VBA
スポンサーリンク

要点まとめ

VBAで OptionalIsMissing を組み合わせる場合、Variant型の引数だけが特別扱いされます。IsMissing は「その引数が省略されたかどうか」を判定する唯一の方法ですが、Variant以外の型では使えません。


制約の詳細(Variant型のOptional引数)

  • Optional Variant引数にはデフォルト値を設定できない
    例:
Sub MySub(Optional x As Variant = "abc") ' ← エラー
VB

→ Variant型では = "abc" のような既定値指定は不可。

  • 省略された場合の状態は「Missing」
    • Empty"" ではなく、特殊な「Missing」フラグが立つ
    • この状態は IsEmpty= "" では判定できない
    • IsMissing関数だけが判定可能
  • IsMissingの動作
Function Sample(Optional arg As Variant)
    If IsMissing(arg) Then
        MsgBox "省略された"
    Else
        MsgBox "渡された: " & arg
    End If
End Function
VB

引数が省略された → IsMissing(arg) は True
値が渡された → False

  • Variant以外の型では使えない
    • Integer, Double, String などに対しては IsMissing は常に無効
    • これらは代わりに Optional x As String = "default" のように既定値を設定して判定する。
  • ParamArrayとの関係
    • IsMissing は ParamArray には使えない(常に False)
    • 空かどうかを判定するには UBound < LBound をチェックする。

注意点

  • IsMissingでTrueになった引数を直接使うとエラーになる場合がある。
    → 必ず「省略されているかどうか」を判定してから利用する。
  • Variant以外は既定値で判定するのが基本。
    例:
Sub MySub(Optional x As String = "default")
    If x = "default" Then
        '省略された
    End If
End Sub
VB

まとめ

  • Optional Variant引数は既定値を設定できない → IsMissingで判定するしかない
  • 省略時は「Missing」という特殊状態になる
  • Variant以外はIsMissing不可 → 既定値で判定する
  • ParamArrayはIsMissingでは判定できない → 配列の境界を確認する

これを理解しておくと、「省略可能な引数を柔軟に扱う」関数設計がスムーズになります。

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