目次
経緯
Excel VBAでマクロを組んでいると、予期しないエラーが発生することがあります。
C#などで使える try-catch
のような例外処理構文が、VBAにもあるのか気になり、今回調べてみました。
結論から言うと、VBAでは On Error
ステートメントを使うことで、例外処理(エラーハンドリング)を行うことが可能です。
使用する構文:On Error GoTo ~ 構文
VBAにおけるエラー処理は、主に On Error GoTo ラベル名
という構文で行います。
これは、エラーが発生した場合にジャンプ先(エラーハンドラ)を指定するという動作です。
実装例:基本的な例外処理コード
以下に、On Error
を使った基本的なエラーハンドリングのサンプルコードを示します。
Sub 例外処理()
On Error GoTo ErrorHandler ' エラー時にジャンプする場所を指定
' ここでエラーが起きる可能性のある処理
If ans = vbYes Then
MsgBox "エラーは発生していません。"
End If
Exit Sub ' 正常に終了する場合はここで抜ける
ErrorHandler: ' エラー処理部
MsgBox "エラーが発生しました。プログラムを終了します。"
Set objOutlook = Nothing ' オブジェクトが存在している場合は解放
Exit Sub
End Sub
このコードの解説
On Error GoTo ErrorHandler
→ エラーが発生した際に、ErrorHandler:
というラベルにジャンプしますExit Sub
をエラーハンドラーの直前に入れることで、正常処理のときはエラー処理に入らないようにしますErrorHandler:
の下では、エラーメッセージを表示したり、後処理を記述したりします- 最後に
Exit Sub
を再度書くことで、エラー処理後にそれ以上の実行を防止します
実務での応用例
- ファイルやオブジェクトが存在しない場合の処理
- セル範囲外アクセスなどによる
Run-time error
の回避 - Outlook、Word など外部アプリとの連携処理におけるエラー処理
- 入力値が不正な場合の事前チェックと安全停止処理
注意点
On Error Resume Next
はエラーを無視して次の処理に進む構文ですが、原因がわかりにくくなるため乱用は避けましょうErr.Number
やErr.Description
を使えば、具体的なエラー内容の取得も可能です- すべての Sub / Function に例外処理を書くことで、より堅牢なマクロになります
まとめ
VBAでも On Error
ステートメントを使うことで、エラー処理が可能です。try-catch
構文のように明確にブロック分けはできませんが、On Error GoTo
によって、安全かつ予測可能な動作を作ることができます。
実務で使用するマクロでは、例外処理は必須の設計要素ですので、ぜひ活用してみてください。
最後までお読みいただきありがとうございました。