要点まとめ
VBAで Optional と IsMissing を組み合わせる場合、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"のように既定値を設定して判定する。
- Integer, Double, String などに対しては
- 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では判定できない → 配列の境界を確認する
これを理解しておくと、「省略可能な引数を柔軟に扱う」関数設計がスムーズになります。


