■ 例外処理のサンプル
予期しないエラーが発生した際に原因を突き止めやすくするため、例外処理を作成しておくことが大切です
VBA では例外処理の記述が統一されにくいため、サンプルを作成してみました
ポイント毎にステップ番号を指定しますが、プログラムを修正することを考慮して10間隔くらいで設定しておきます
(文字列にしているので単純に連番にしておいて、追加するときは枝番等を利用することも可能です)
On Error の飛び先では、エラー処理を呼び出すのみとなります
先頭の引数は関数名とし、メイン処理のみ最後に True を追加で指定します
'' メイン処理
Public Sub Main_Proc()
Dim st_step As String '' ステップ番号
On Error GoTo Err_Routine
st_step = "0010"
st_step = "0020" '' ポイント毎にステップ番号を設定
Call Sub_Proc01
Exit Sub
Err_Routine:
Call Error_Proc("Main_Proc", st_step, True)
End Sub
'' サブ処理01
Private Sub Sub_Proc01()
Dim st_step As String '' ステップ番号
On Error GoTo Err_Routine
st_step = "0010"
st_step = "0020"
st_step = "0030"
Call Sub_Proc02
Exit Sub
Err_Routine:
Call Error_Proc("Sub_Proc01", st_step)
End Sub
'' サブ処理02
Private Sub Sub_Proc02()
Dim st_step As String '' ステップ番号
On Error GoTo Err_Routine
st_step = "0010"
'' 意図的にエラーを発生させる
MsgBox Format$(5 / 0)
Exit Sub
Err_Routine:
Call Error_Proc("Sub_Proc02", st_step)
End Sub
'*------------------------------------------------------------------------------
'* エラー処理
'*------------------------------------------------------------------------------
Private Sub ProcError(ByVal st_proc As String, ByVal st_step As String, _
Optional ByVal bln_main As Boolean = False)
'' エラー発生の呼び出し履歴を作成する
If (Left$(Err.Source, 3) <> " → ") Then
Err.Source = " → " & st_proc_name & "." & st_step
Else
Err.Source = " → " & st_proc_name & "." & st_step & Err.Source
End If
If (bln_main) Then
'' システムエラーを表示する
MsgBox "予期しないエラーが発生しました。" & vbCrLf & vbCrLf & _
Err.Description & " (" & Err.Number & ")" & vbCrLf & vbCrLf & _
Mid$(Err.Source, 3), vbCritical, "業務タイトル"
Else
'' 呼び出し元の関数でエラーを発生させる
Call Err.Raise(Err.Number, Err.Source, Err.Description)
End If
End Sub
Sub_Proc02 の中でエラーが発生すると(意図的にエラーを発生させています)、メイン処理まで遡ってエラーメッセージが表示されます
エラーが発生したモジュールまでの履歴が表示されるので、直接の原因がエラー発生モジュールと異なるような場合でも便利です