2014年7月20日日曜日

[VBA] If ステートメントでエラーとなる考慮

VBA では、If...Then...Else ステートメントに複数の条件をつなげるとエラーになるケースを考慮する必要がある。

他の言語ならば AND 演算子の条件は False と判定された時点でその後の条件式を処理しないが、VBA の場合は全ての条件式を処理してしまうので、条件式の前のチェックを続けて確認するとエラーとなってしまう。

(例) If 式1 And 式2 And 式3 Then の場合は
  • 他言語: 式1が False ならば、式2以降は判定しない。
  • VBA: 式1の結果に関わらず、式2以降も全て判定する。
これだと、式2を処理する前のチェックを式1で行うとエラーとなってしまうので、注意が必要である。

1.Null チェックと合わせて条件式をつなげる

Collection が Null の場合は、条件式1 (Not IsNull) 結果が False であるにも関わらず、後続の条件式も判定してしまう。
If Not IsNull(Collection) And Collection.Count > 0 Then
    Debug.Print "Count > 0"
End If
エラーメッセージ: 424 オブジェクトが必要です。

2.数値チェックと合わせて条件式をつなげる

Value が Null や Nothing の場合は、IsNumeric 関数が False であるにも関わらず、後続の CInt 関数でエラーとなってしまう。
If IsNumeric(Value) And CInt(Value) > 0 Then
    Debug.Print "Value > 0"
End If
エラーメッセージ: 91 オブジェクト変数または With ブロック変数が設定されていません。