エラー処理とは?
プログラムが何らかの原因で意図しない処理を行なった場合、悪影響を最低限に抑える為の処理のことをエラー処理と言います。考え方には次の2通りがあります。
・フェイルセーフ(Fail-Safe) :安全を第一(データの消失や破壊防止)に考え、処理を中断し以後の処理は行わない
・フールプルーフ(Fool-Ploof):できる限り処理を簡素化し、間違いが起こっても他の処理に影響しないようにする
Excel-VBAでのエラー処理
Excel-VBAでは「On Error」というステートメントで、プログラム専用のエラー処理を行なうことが可能です。「On Error Goto」は、「エラーが起こったときには、次の処理を行う」という意味です。
使い方は以下の通りです。
1 2 3 4 5 6 7 8 9 |
On Error Goto エラー処理ラベル (本来の処理) Exit Sub 'マクロ処理を抜ける場合。他にもループを抜ける「Exit For」「Exit Do」も可。 エラー処理ラベル: 'ラベル直後の「:」は半角。 (エラー発生時の処理) |
また、エラーが発生した時点で処理そのものを強制中断する場合は、
1 |
On Error Goto 0 '最後は数字の「ゼロ」。 |
エラーが発生しても強制的に処理を続行する場合は、
1 |
On Error Resume Next |
というものを、エラーが発生する可能性のある処理の前の行に宣言します(エラー処理の注意点参照)。
エラー処理後に処理を続行したい場合は、エラー処理の一番最後の行に、
1 |
Resume 'エラーが発生した行に戻って処理を継続する |
1 |
Resume Next 'エラーが発生した行の次の行から処理を継続する |
のどちらかを追加します。
<マクロ例>
セルB2が数値でなかった場合、エラーメッセージを表示するプログラムを組んでみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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はエラーを無視して処理継続するため、要注意)。
・エラー処理は全体の処理速度を低下させてしまうことがある(エラートラップの処理内容にもよる)。
また、エラートラップの宣言は、必ず処理の前に行いましょう。次のマクロの例では宣言がエラー発生後であるため、エラートラップが有効になっていません。
<マクロ例>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |