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 | ヘルプファイルに関する情報(通常は未使用) |
LastDllError | WinAPI等で発生した最後のDLLエラー番号 |
主なメソッド
メソッド名 | 内容 |
---|---|
Clear | Err の状態をリセット |
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 Next | On Error GoTo ラベル |
---|---|---|
処理方法 | エラーを無視し次の行へ | エラー発生時に指定ラベルへ |
向いているケース | 軽微なエラーのスキップ | 詳細な処理やログ取得 |
エラーの確認 | 自力で Err.Number をチェック | 自動的にジャンプ処理 |
注意点 | 見落としやすく不安定になる可能性 | コードが複雑になりやすい |
7. まとめ
Resume Next
:無視して次に進める。軽微な処理に。GoTo
:エラー専用処理にジャンプ。本格的な対処に向く。Err
オブジェクトでエラーの詳細情報を取得&ログに活用。Err.Clear
を忘れずに。- カスタムエラーは
Err.Raise
で発生可能。
エラー処理を適切に活用することで、プログラムの安定性が向上し、予期しないトラブルにも柔軟に対応できるようになります。
コメント