VBAには、try-catch-finallyにexceptionクラスを使った例外処理・・・
といったことができないので、ちょっと工夫が必要。
exceptionクラスを自分で作成するまでやりたくないけど、ちょっとしたデバッグ用コード
■最低限必要なコード
・コールスタックを取得したいメソッド(プロパティ)には「 On Error GoTo ・・・」で例外時のふるまいを記載
・例外発生時に、Errオブジェクトの内容を書き換え(書き加え)て、呼び元のメソッド
に戻す (Err.Raise)こととする。
■ソース例
‘呼び元(トップ)
Sub main()
‘▼エラー監視の開始
On Error GoTo ExceptionHandling
‘~処理~
‘ エラー発生で ラベル ExceptionHandling: 以降を実行。
Call funcA
‘正常終了時
Exit Sub
‘例外発生時
ExceptionHandling:
Dim s As String
s = Err.Number & vbCr & vbLf _
& Err.Source & vbCr & vbLf _
& Err.Description & vbCr & vbLf _
& Err.HelpContext & vbCr & vbLf _
& Err.HelpFile & vbCr & vbLf _
& Err.LastDllError & vbCr & vbLf
‘▼例外処理の結果
Debug.Print s
End Sub
Sub funcA()
‘▼エラー監視の開始
On Error GoTo ExceptionHandling
Call funcB
ExceptionHandling:
‘▼例外処理実行
Err.Source = Err.Source & "->funcA"
Call Err.Raise(Err.Number, Err.Source, Err.Description)
End Sub
Sub funcB()
‘▼エラー監視の開始’
On Error GoTo ExceptionHandling
Call funcC
ExceptionHandling:
‘▼例外処理実行
Err.Source = Err.Source & "->funcB"
Call Err.Raise(Err.Number, Err.Source, Err.Description)
End Sub
Sub funcC()
‘▼エラー監視の開始
On Error GoTo ExceptionHandling
‘テスト用に適当な例外を発生
”Err.Raise 100
Dim a As Integer
a = 100 / 0
ExceptionHandling:
‘▼例外処理実行
Err.Source = Err.Source & "->funcC"
Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)
End Sub
■実行結果の例
011
VBAProject->funcC->funcB->funcA
0 で除算しました。
1000011
C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA6\1041\VbLR6.chm
0
※ポイントは2行目
※例外の発生した”fancC”から 、呼び元までコールされたメソッドが
※記載されるようになっている。
コメント