タイトルどおりだけど、VBAの条件演算子は短絡評価にならない。
どういうことかというと、以下のようなNULLチェックがうまくいかない。
でも、VBAのOr演算子は2項の演算項を両方とも評価してから、Or演算を実行するので、xがNothingの場合も x.Foo = "abc" が評価されて実行時エラーが発生してしまう。
これはCやJavaに慣れたプログラマからすると、ちょっとばかりやりにくいよね。
そのためか、VB.NETではAndAlso/OrElseという短絡評価用の条件演算子が導入されている。
でも、VBAにはAndAlso/OrElseは導入されていない。
ポイントは条件が成立しているかの変数を用意して、その変数の条件を見て、各条件を次々に適用していくところ。
Orが連続する場合:
Andが連続する場合:
どういうことかというと、以下のような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
0 件のコメント:
コメントを投稿