LoginSignup
0
0

More than 1 year has passed since last update.

VBAにおけるエラーハンドリングのテンプレート

Last updated at Posted at 2023-01-30

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

image.png
image.png

想定できるエラーはエラー番号を独自に振っておきます。
(Excel側で用意してるエラー番号と被らないものを使う)
ドキュメントで自分で振ったエラー番号ごとの情報をまとめておけば、
エラー発生問い合わせ時に原因の特定の助けになります。

想定外のエラーと想定できるものを分けたいときは、エラー番号の数値の範囲で
エラー種別を振り分けるのが今のところ私が使っている手法です。
たとえば今回は50001~50100のエラー番号を独自で使うと決め、
エラー発生時にErr.Numberを調べて、
自分で使うと決めた50001~50100の範囲のエラー番号であれば想定されるエラー
そうでなければ想定外のエラーとして処理するという形です。

このやり方であればエラーの分類はもっと細かく分けることも可能です。


あとここでは割愛してますが、エラー番号の範囲の数値などのマジックナンバー的なものは
定数としてモジュールレベルで宣言しておきます。

最後に後処理でエラー起きた時ハンドリングできないので注意です。
複雑な処理は入れないでおきましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0