エラー処理の基本:On Error Resume Next / GoTo

VBA(Visual Basic for Applications)で開発をしていると、エラー処理は避けて通れません。
「存在しないシートを参照してしまった」「ゼロ除算が起きた」「ファイルが見つからなかった」など、予期しないエラーでプログラムが停止してしまうこともあります。

この記事では、VBAのエラー処理における基礎である On Error Resume Next と On Error GoTo の使い分け方、そしてエラーの詳細を取得・処理するための Err オブジェクトについて詳しく解説します。


1. エラー処理が必要な理由

プログラムの実行中、次のような「実行時エラー」が発生する可能性があります。

  • 存在しないシートを参照しようとした
  • 0で割ろうとした(ゼロ除算)
  • ファイルが存在しなかった

これらを放置すると、処理が中断され、ユーザー体験を大きく損ねることになります。
エラー処理を入れることで、柔軟に対処でき、より安全なコードが書けるようになります。


2. On Error Resume Next の使い方と特徴

On Error Resume Next は、エラーが発生しても中断せず、次の行に処理を進める命令です。

使用例

Sub ResumeNextExample()
On Error Resume Next 'エラーを無視して次に進む

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("存在しないシート") 'エラーになるが止まらない

If ws Is Nothing Then
MsgBox "シートが見つかりませんでした。"
End If

On Error GoTo 0 'エラー処理をリセット
End Sub

特徴

  • 簡易チェックや一時的にエラーを無視したいときに便利
  • エラーの有無は自分で判定する必要がある
  • 処理が続くため、見落とすとバグの原因になりやすい

3. On Error GoTo の使い方と特徴

On Error GoTo ラベル名 は、エラーが発生したときに特定の処理(エラーハンドラ)へジャンプさせる命令です。

使用例

Sub GoToExample()
On Error GoTo ErrorHandler

Dim x As Integer
x = 1 / 0 'ゼロ除算エラー発生

MsgBox "処理成功"

Exit Sub

ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description
End Sub

特徴

  • エラーが発生した時点で処理を中断し、指定のラベルにジャンプ
  • Err オブジェクトと組み合わせてエラーの詳細を取得可能
  • Exit Sub を忘れると、エラーハンドラを通過してしまうので注意

4. On Error GoTo 0 でエラーモードをリセット

On Error GoTo 0 は、現在のエラーハンドリング設定を解除し、通常のエラー動作(即停止)に戻します。

On Error GoTo 0

エラー処理が不要になった時点で、必ず書く習慣をつけておくと安全です。


5. Err オブジェクトの基本と活用方法

Err は、VBAに組み込まれているオブジェクトで、発生したエラーに関する情報を保持します。エラーハンドリングで不可欠な存在です。

主なプロパティ

プロパティ名内容
Numberエラー番号(0のときはエラーなし)
Descriptionエラー内容の説明
Sourceエラーの発生元(プロジェクトやモジュール名)
HelpFile / HelpContextヘルプファイルに関する情報(通常は未使用)
LastDllErrorWinAPI等で発生した最後のDLLエラー番号

主なメソッド

メソッド名内容
ClearErr の状態をリセット
Raise任意のエラーを発生させる(カスタムエラー用途)

使用例:エラー情報を表示

Sub ErrPropertyExample()
On Error GoTo ErrorHandler

Dim a As Integer
a = 1 / 0 'エラー発生

Exit Sub

ErrorHandler:
MsgBox "エラー番号: " & Err.Number & vbCrLf & _
"説明: " & Err.Description & vbCrLf & _
"発生元: " & Err.Source
Err.Clear 'エラー情報をリセット
End Sub

使用例:カスタムエラーの発生

Sub RaiseErrorExample()
On Error GoTo CatchError

Err.Raise 1001, "MyModule", "カスタムエラーです"

Exit Sub

CatchError:
MsgBox "カスタムエラー:" & Err.Number & " - " & Err.Description
End Sub

6. Resume Next と GoTo の使い分けまとめ

比較項目On Error Resume NextOn Error GoTo ラベル
処理方法エラーを無視し次の行へエラー発生時に指定ラベルへ
向いているケース軽微なエラーのスキップ詳細な処理やログ取得
エラーの確認自力で Err.Number をチェック自動的にジャンプ処理
注意点見落としやすく不安定になる可能性コードが複雑になりやすい

7. まとめ

  • Resume Next:無視して次に進める。軽微な処理に。
  • GoTo:エラー専用処理にジャンプ。本格的な対処に向く。
  • Err オブジェクトでエラーの詳細情報を取得&ログに活用。
  • Err.Clear を忘れずに。
  • カスタムエラーは Err.Raise で発生可能。

エラー処理を適切に活用することで、プログラムの安定性が向上し、予期しないトラブルにも柔軟に対応できるようになります。

コメント

タイトルとURLをコピーしました