Excel VBAでエラー処理を行う:On Error

エラー処理とは?

プログラムが何らかの原因で意図しない処理を行なった場合、悪影響を最低限に抑える為の処理のことをエラー処理と言います。考え方には次の2通りがあります。

フェイルセーフ(Fail-Safe) :安全を第一(データの消失や破壊防止)に考え、処理を中断し以後の処理は行わない
フールプルーフ(Fool-Ploof):できる限り処理を簡素化し、間違いが起こっても他の処理に影響しないようにする

Excel-VBAでのエラー処理

Excel-VBAでは「On Error」というステートメントで、プログラム専用のエラー処理を行なうことが可能です。「On Error Goto」は、「エラーが起こったときには、次の処理を行う」という意味です。

使い方は以下の通りです。

On Error Goto エラー処理ラベル

  (本来の処理)

Exit Sub 'マクロ処理を抜ける場合。他にもループを抜ける「Exit For」「Exit Do」も可。

エラー処理ラベル:  'ラベル直後の「:」は半角。

  (エラー発生時の処理)

また、エラーが発生した時点で処理そのものを強制中断する場合は、

On Error Goto 0 '最後は数字の「ゼロ」。

エラーが発生しても強制的に処理を続行する場合は、

On Error Resume Next

というものを、エラーが発生する可能性のある処理の前の行に宣言します(エラー処理の注意点参照)。

エラー処理後に処理を続行したい場合は、エラー処理の一番最後の行に、

Resume  'エラーが発生した行に戻って処理を継続する
Resume Next 'エラーが発生した行の次の行から処理を継続する

のどちらかを追加します。

<マクロ例>

セルB2が数値でなかった場合、エラーメッセージを表示するプログラムを組んでみます。

Sub Error_Sample_01() 'セルB2に数値以外の文字があるとエラートラップErrCelValに移行。

    On Error Goto ErrCelVal

    Dim cNum as Long

        cNum = Cells(2,2).Value

        Msgbox cNum

        Exit Sub


ErrCelVal:

        Msgbox "セルに数値が入っていません。"

End Sub

エラー処理の注意点

エラー処理を行なうにあたって、次の点は慎重に検討する必要があります。

・発生したエラーが処理結果やPC動作等に問題あるかどうか?
・適切なエラー処理かどうか?

その理由として2つ挙げられます。

・エラー処理自体がさらなるエラーの発生源となる可能性がある(特にOn Error Resume Nextはエラーを無視して処理継続するため、要注意)。
・エラー処理は全体の処理速度を低下させてしまうことがある(エラートラップの処理内容にもよる)。

また、エラートラップの宣言は、必ず処理の前に行いましょう。次のマクロの例では宣言がエラー発生後であるため、エラートラップが有効になっていません。

<マクロ例>

Sub Error_Sample_02()

'セルB2に数値以外の文字がある場合でもエラートラップErrCelValが働かない。

    Dim cNum As Long

    cNum = Cells(2, 2).Value 'ここでエラー発生。

        MsgBox cNum

    On Error GoTo ErrCelVal 'エラートラップはこの行以降で有効となる。

        Exit Sub

    ErrCelVal:

        MsgBox "セルに数値が入っていません。"

End Sub