If
でオブジェクトがNothing
でない事を確認してからプロパティを判定してるのにエラーになった。えっなにコレ?
まさかそんな仕様の言語があったとは
世の多くのプログラミング言語では、A And B や A Or B などの論理演算において、 A だけで結果が確定してしまう場合は B の評価は省略される仕様(短絡評価)になっている事が多いが、VBA は短絡評価は行われず、常に A と B の両方とも評価してから論理演算を行う仕様 らしい。
その結果、例えばオブジェクトが Nothing でない事を確認してから判定する際、以下のような書き方だとエラーになるので注意。
'VBA の場合は myObj が Nothing の場合も And の後の赤い部分まで
'判定してしまうため、myObj にアクセスできずエラーになる
If Not myObj Is Nothing And myObj.count > 10 Then
...
'VBA ではこのように書くしかない
If Not myObj Is Nothing Then
If myObj.count > 10 Then
...
また、複数の処理を結果を見ながら段階的に行う場合も、下記のような書き方だと途中結果に関わらず全処理が行われてしまい、想定外のエラーや高負荷になってしまう。
'CheckFunc1() が True の場合のみ CheckFunc2() を実行しているつもりでも
'この書き方だと常に両方実行されてしまう
If CheckFunc1() And CheckFunc2() Then
...
さすがに使い勝手が悪すぎるので VB.NET には AndAlso
や OrElse
という短絡評価を行う新しい演算子が作られたらしいが、VBA では 2024/2 現在でもこれらの演算子は追加されず、If
を重ねるしかない模様。