ぴろりのくせになまいきだ。

世間に平和はおとずれなぁい

On Error Resume Nextが効かない?(VBA)

※内容は脚色している部分がありますのでご了承ください。

相談されたこと

普段使っているマクロが急に動かなくなったので見てほしい。
VBAで書かれたいわゆる「秘伝のソース」が動かなくなったとのことでした。
他の人も使っているにもかかわらず、特定のPCのみで動かないとのことでした。

やってみたこと

とりあえず動かしてもらいました。すると、確かにエラーで止まっています。
エラーが発生する行を見てみると、特定の名称のファイルを参照しようとしているものの、そのファイルが見当たらないようです。
ただ、その行は、On Error Resume Next …… On Error GoTo 0の間にあったので、本来的にはエラーが発生しても無視されるはずです。

まず、思い当たったこととしては、コンパイルエラーです。実行時のエラーが無視されるはずなので、エラーで止まるとしたらそれかなあと思いました。
そう思ったので、とりあえずその行をコメントアウトしました。
しかし、コメントアウトした状態で実行すると、他のところでもエラーが発生して止まるのです。

その他のところを見てみると、これも同じくOn Error Resume Next …… On Error GoTo 0の間にありました。
そもそも何かおかしいと思い、エラーをよく見てみると、「実行時エラー」とありました。つまり、On Error Resume Nextステートメントがあるにもかかわらず、なぜか実行時エラーをキャッチして中断しているのです。

原因だったこと

「そんなことある?」と思いつつ、「On Error Resume Next 効かない」で検索をかけてみると、以下のブログがヒットしました。
VB6 On Error Resume Nextが動作しない: 使えないプログラマー
このブログでは、VB6についての言及でしたが、おそらくVBAにも似たような設定があるに違いないと思い、設定を探してみました。
すると、[ツール]→[オプション]→[全般]タブの[エラートラップ]のトグルが、「エラー発生時に中断」になっていました。
これを「エラー処理対象外のエラーで中断」に変更することで、今まで通り動くようになりました。

つまり、On Error Resume Nextステートメントにかかわらず、エラートラップの設定が「エラー発生時に中断」になっていればエラーをキャッチして実行を中断する、ということでした。

教訓

エラーメッセージは思い込みを排除したうえでよく読みましょう。