VBAにおけるエラーハンドリングのテンプレート
①まず頭で「On Error GoTo ERROR_HANDLER」しておく
②メインの処理(main)から呼び出されるプロシージャで値のチェックなどを実施
③チェックの結果ダメならエラーを発生させてmainにスロー(OKならそのまま処理続行)
④スローされたらエラー用のラベル(ERROR_HANDLER)に飛ぶのでエラー用メッセージを表示
⑤「GoTo EXIT_RUN」して後処理(EXIT_RUNラベル内の処理)を行う
⑥後処理の最後にExit Sub でmainを抜ける
上記が基本の構成です。
下記にサンプルを載せます
Public Sub main()
Dim errMessage As String
On Error GoTo ERROR_HANDLER
'処理
Call sample
EXIT_RUN:
'後処理
Exit Sub
ERROR_HANDLER:
'エラー時の処理
errMessage = "エラー番号:" & Err.Number & vbCrLf & Err.Description
If Err.Number >= 50001 And Err.Number <= 50100 Then
Call MsgBox(Prompt:=errMessage, Buttons:=vbExclamation, Title:="規定エラー")
Else
Call MsgBox(Prompt:=errMessage, Buttons:=vbCritical, Title:="想定外エラー")
End If
GoTo EXIT_RUN
End Sub
'------------------------------------------------------------------------------------
'mainから呼び出されるプロシージャ
Private Sub sample()
'何かをチェックしてダメならエラーを発生させる
If True Then
Call Err.Raise(Number:=50001, Description:="エラー1発生")
End If
End Sub
想定できるエラーはエラー番号を独自に振っておきます。
(Excel側で用意してるエラー番号と被らないものを使う)
ドキュメントで自分で振ったエラー番号ごとの情報をまとめておけば、
エラー発生問い合わせ時に原因の特定の助けになります。
想定外のエラーと想定できるものを分けたいときは、エラー番号の数値の範囲で
エラー種別を振り分けるのが今のところ私が使っている手法です。
たとえば今回は50001~50100のエラー番号を独自で使うと決め、
エラー発生時にErr.Numberを調べて、
自分で使うと決めた50001~50100の範囲のエラー番号であれば想定されるエラー
そうでなければ想定外のエラーとして処理するという形です。
このやり方であればエラーの分類はもっと細かく分けることも可能です。
あとここでは割愛してますが、エラー番号の範囲の数値などのマジックナンバー的なものは
定数としてモジュールレベルで宣言しておきます。
最後に後処理でエラー起きた時ハンドリングできないので注意です。
複雑な処理は入れないでおきましょう。