[VBA] VBAの条件演算子は短絡評価にならない

2017年2月6日月曜日

VBA

タイトルどおりだけど、VBAの条件演算子は短絡評価にならない。
どういうことかというと、以下のようなNULLチェックがうまくいかない。
If x = Nothing Or x.Foo = "abc" then
これはxがNothingではない場合に限って、x.Fooを参照することを意図している。

でも、VBAのOr演算子は2項の演算項を両方とも評価してから、Or演算を実行するので、xがNothingの場合も x.Foo = "abc" が評価されて実行時エラーが発生してしまう。

これはCやJavaに慣れたプログラマからすると、ちょっとばかりやりにくいよね。
そのためか、VB.NETではAndAlso/OrElseという短絡評価用の条件演算子が導入されている。

でも、VBAにはAndAlso/OrElseは導入されていない。

じゃあ、どうしよう

と思って、少し考えてみたけど、結局こんな感じにするしかないのかなぁ。。。
ポイントは条件が成立しているかの変数を用意して、その変数の条件を見て、各条件を次々に適用していくところ。

Orが連続する場合:
    Dim cond As Boolean

    ' 条件1'
    cond = (x = Nothing)
    ' 条件2'
    If Not cond Then cond = (x.Foo = "abc")
    ' 条件が他にもあれば、同様に続く...'
    If Not cond Then cond = ...

    If cond Then
        Debug.Print "condition is True."
    End If

Andが連続する場合:
    Dim cond As Boolean

    ' 条件1'
    cond = (x <> Nothing)
    ' 条件2'
    If cond Then cond = (x.Foo = "abc")
    ' 条件が他にもあれば、同様に続く...'
    If cond Then cond = ...

    If cond Then
        Debug.Print "condition is True."
    End If