読者です 読者をやめる 読者になる 読者になる

エラー対応の仕方

VBA一般

 ずっと、「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にしているけれど、多くの場合は全く別個の対応なんていうこともないだろうから、その辺は引数を利用して柔軟に対応したらいいと思う。