便利そうに見えるエラー無視
VBAでよく見かける構文に On Error Resume Next があります。
この一文をコードの冒頭に書いておくだけで、エラーが発生してもマクロが止まらずに次の行へ進むという仕様になります。
たとえば次のようなコードです。
Sub Sample()
Dim ws As Worksheet
On Error Resume Next
Set ws = Worksheets("データ")
ws.Range("A1").Value = "テスト"
On Error GoTo 0
End Sub
このマクロは「データ」シートが存在しない場合でもエラーを表示せず、次の処理に進んでしまいます。実行は止まりません。
一見、柔軟で便利なように思えるかもしれませんが、エラーに気づけないという大きな落とし穴があります。
実例で学ぶ「気づけないエラー」
たとえば、存在しないシートにアクセスしようとしても、何も表示されずに終了してしまいます。
Sub TestError()
Dim ws As Worksheet
On Error Resume Next
Set ws = Sheets("存在しない")
ws.Range("A1").Value = "OK"
On Error GoTo 0
End Sub
このコード、ぱっと見では正常に動いているように見えます。
しかし実際は Set ws = Sheets("存在しない") で ws は実際にはシートが存在しないので、 Nothing になっています。※今回はわかりやすいように「存在しない」というシート名にしていますが、想定していたシート名が入っていると考えてください。
動作上は Nothing.Range("A1") となるので、処理は実は何もしていません。
つまり、処理がスキップされただけで何も書き込まれていないのです。
より安全な書き方
次のようにエラーが起きたことがわかる仕組みに変えるのがよいです。
Sub SafeSetSheet()
Dim ws As Worksheet
On Error Resume Next
Set ws = Sheets("存在しない")
On Error GoTo 0
If ws Is Nothing Then
MsgBox "シートが見つかりませんでした。"
Exit Sub
End If
ws.Range("A1").Value = "OK"
End Sub
このように「意図的に」 On Error Resume Next を使い、その直後に On Error GoTo 0 で一度リセットする、そして条件判断でエラーを把握するという流れが大切です。
実装するメリットと注意点
メリット
- マクロ全体を止めずに処理を続けられる(開発中は特に有効)
- 既存ファイルやシートが無い状況に対応できる
- 例外的な処理を「仕方ない」として許容できる
注意点
- エラーを放置したまま次へ進むとバグに気づけない
- 本来必要な処理が飛ばされても、気づかない
- 他の人が見たときに、何が起きているのかわかりにくい
まとめ
エラー処理は、マクロの信頼性に大きく影響します。
特に「知らないうちに処理がスキップされていた」では、実務で致命的なミスになりかねません。
On Error Resume Next は、正しく使えばとても強力な味方になりますが、間違った使い方をすればトラブルの原因になります。
まずは「何のためにエラー処理を入れるのか?」を考えながら、意図のあるコードに仕上げていきましょう。
