Excel VBAでは、エラーが発生したときに適切な処理を行うことがとても重要です。
特に実務でマクロを使う場合、ユーザーの入力ミスやデータの不整合によって、意図しないエラーが発生することはよくあります。
そんなとき、マクロ全体を止めてしまうのではなく、スマートに処理を分岐して、必要な後処理やメッセージ表示を行うのが望ましいです。
今回は「エラー処理を一箇所にまとめて管理する方法」について解説します。
GoToで飛ばすエラー処理の基本構文
VBAでは、On Error GoTo を使うことで、エラーが発生したときに指定したラベルに処理をジャンプさせることができます。
Sub SampleProcess()
On Error GoTo ErrHandler ' エラー時はラベルErrHandlerへ
' 通常の処理
Dim v As Double
v = Cells(1, 1).Value ' 数字以外があるとエラーに
MsgBox "正常終了しました。"
Exit Sub ' 正常終了時はエラー処理に行かないようにする
ErrHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
コードのポイント
On Error GoTo ラベル名は、処理の先頭で一度だけ書くのが基本です。Exit Subを入れておくことで、正常終了時にエラー処理部分へ飛ばないようにできます。Err.Descriptionで、エラー内容の概要をメッセージに表示できます。
処理ごとに分岐するより、1か所でまとめる
エラー処理を一つひとつの処理に個別に書くと、コードが長くなり、見通しも悪くなってしまいます。
悪い例:処理ごとにエラー処理を書く
Sub BadExample()
On Error Resume Next
' 1つ目の処理
Cells(1, 1).Value = 1 / 0 ' エラーになる
If Err.Number <> 0 Then
MsgBox "1つ目の処理でエラー"
Err.Clear
End If
' 2つ目の処理
Cells(1, 2).Value = "A" * 2
If Err.Number <> 0 Then
MsgBox "2つ目の処理でエラー"
Err.Clear
End If
End Sub
こういった書き方は、エラーがどこで出たかの管理はできますが、可読性(コードの見やすさ)が下がり、コードの修正も大変になります。
推奨例:エラー処理は末尾にまとめる
Sub GoodExample()
On Error GoTo ErrHandler
' 一連の処理
Cells(1, 1).Value = 1 / 0 ' エラーになる
Cells(1, 2).Value = "A" * 2
MsgBox "すべての処理が完了しました"
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました: " & Err.Description
End Sub
このように、処理の流れを崩さずに、エラー時だけ指定の場所で対応できるようにすると、メンテナンス性が大きく向上します。
実装するメリット
このようにエラー処理を1か所にまとめることで、次のようなメリットがあります。
- マクロ全体の見通しが良くなる
- 修正時にエラー処理をいじる必要がなくなる
- 「どこでエラーが起きたか」を正確に把握しやすくなる
- 想定外の中断を減らすことができる
まとめ
エラー処理は、実務で安定してマクロを動かすための「保険」のようなものです。
最初のうちは「動けばいい」だけで作ってしまいがちですが、運用や再利用のフェーズではエラー対策が不可欠になります。
マクロの最後にエラー処理をまとめて記述することで、スマートで読みやすく、安心して使えるコードに近づけましょう。
ちょっとした意識と工夫で、コードの品質は大きく変わります。
