エラー対応の仕方
ずっと、「On Error Resume Next」が怖くて使えなかった。
だって、「エラーが出ても気にせずに次に進め!」なんて、そんな無責任かつ投げやりな対応が許されていいのか、と思っていたんですよ。
でも、最近はもっぱらコレばっかり。
そこそこ大規模なマクロを作るようになると、「On Error GoTo ラベル」というやり方に「不便やなー」と感じることが多くなったから(いや、単なる私のスキル不足かも知れんが)。
なんか、「On Error GoTo ラベル」って、一方通行な感じで使いづらいんですわ。
基本的に、
On Error Resume Next
Err.Clear
'メインの処理
If Err.Number > 0 then
'エラー対応の処理
End If
On Error GoTo 0
の形にすることが多い。
ついでに言うと、エラー対応の処理は、別にエラー対応用のプロシージャを作ってそれを呼び出すようにしている。
処理のブロックごとに番号をつけておいて、エラー対応プロシージャを呼び出すときに、その処理ブロック番号と、エラー番号(ErrオブジェクトのNumberプロパティ)とエラー説明(ErrオブジェクトのDescriptionプロパティ)を渡すようにしている。
コードのイメージは次のような感じ。
Sub Proc1()
On Error Resume Next
Err.Clear
'処理1
If Err.Number > 0 then
Call errorCatch( 1, Err.Number, Err.Description)
End If
On Error GoTo 0
End Sub
Sub Proc2()
On Error Resume Next
Err.Clear
'処理2
If Err.Number > 0 then
Call errorCatch( 2, Err.Number, Err.Description)
End If
On Error GoTo 0
End Sub
Sub Proc3()
On Error Resume Next
Err.Clear
'処理3
If Err.Number > 0 then
Call errorCatch( 3, Err.Number, Err.Description)
End If
On Error GoTo 0
End Sub
Sub errorCatch(ByVal processNum As Integer, _
ByVal errorNum As Integer, _
ByVal errorDescription As String)
Select Case processNum
Case 1
'処理1へのエラー対応
Case 2
'処理2へのエラー対応
Case 3
'処理3へのエラー対応
End Select
End Sub
ざっとこんな感じ。エラー対応プロシージャでは、分かりやすいようにSelect~Caseにしているけれど、多くの場合は全く別個の対応なんていうこともないだろうから、その辺は引数を利用して柔軟に対応したらいいと思う。