VBAの「暴走」を止める。エラーハンドリングという名の「安全装置」を実装しよう
マクロの記録から脱却し、自力でコードを書き始めた皆さんが最初にぶつかる壁。それは、「予期せぬエラーでマクロが突然停止し、Excelがデバッグモードで凍りつく」という恐怖体験ではないでしょうか。
初心者のうちは「動けばいい」と考えがちですが、プロのエンジニアは違います。私たちは「エラーが起きないコード」ではなく、「エラーが起きても正しく後始末をして終了できるコード」を書いています。
今日は、VBAにおけるエラーハンドリングの「黄金律」を伝授します。これさえ覚えれば、あなたのマクロは一気に「業務に耐えうる堅牢なツール」へと進化します。
—
なぜ「エラーハンドリング」が必要なのか?
Excel VBAは、ユーザーの操作ミスや外部ファイルの消失など、予期せぬ事態に直面すると、容赦なく「デバッグ」画面を突きつけてきます。
もし、あなたが作ったマクロが、誰かのPCで突然止まり、「終了」や「デバッグ」のボタンを迫られたらどうでしょう。その人はパニックになり、二度とあなたのマクロを使ってくれないかもしれません。
エラーハンドリングとは、「不測の事態を検知し、責任を持って後始末をして、優雅に退出する」ための作法なのです。
—
これがエラーハンドリングの「基本テンプレート」だ
まずは、最も汎用的な「定型パターン」を頭に叩き込んでください。
Sub Sample_ErrorHandling()
‘ 1. エラー監視の開始(ここからエラーが発生したらErrorHandlerへ飛べ)
On Error GoTo ErrorHandler
‘ — 本来の処理を書く場所 —
Debug.Print 1 / 0 ‘ わざと0除算エラーを起こしてみる
‘ —————————-
‘ 正常終了した場合は、ここでルーチンを抜ける(重要!)
Exit Sub
ErrorHandler:
‘ 2. エラー発生時の処理
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical
‘ 3. ここで後始末(画面更新の再開など)を行う
Application.ScreenUpdating = True
‘ 4. 必要に応じてResumeで復帰、あるいはExit Subで終了
End Sub
このコードの「魂」を解説する
- `On Error GoTo ErrorHandler`: これが「安全装置のスイッチ」です。これがないと、エラー発生時にVBAは強制終了します。
- `Exit Sub`: これを書き忘れる初心者が非常に多い!正常に終わった時も `ErrorHandler` を通ってしまわないよう、ここで必ず脱出するのが鉄則です。
- `ErrorHandler:`: ラベルと言います。エラーが起きたとき、VBAはここへ「ワープ」します。
- `Errオブジェクト`: エラーの詳細(番号や内容)を教えてくれる神の使いです。
—
現場で使う「Resume」の正しい理解
エラーハンドリングを語る上で欠かせないのが `Resume` です。これは「エラーが発生した場所まで戻って、処理をやり直せ」という命令です。
1. Resume Next:エラーを「なかったこと」にする
エラーが起きた行をスキップして、次の行から再開します。
On Error Resume Next
Workbooks.Open “存在しないファイル.xlsx” ‘ ここでエラーが出るが…
On Error GoTo 0 ‘ 監視を解除(重要!)
‘ エラーを無視して次の処理へ進む
2. Resume:再試行を促す
エラーの原因を取り除いた後、再度同じ行を実行します。
ErrorHandler:
‘ もしファイルが見つからないエラーなら、ユーザーに選択させる
If Err.Number = 1004 Then
MsgBox “ファイルが見つかりません。パスを確認してください。”
Resume ‘ 再度、さっきの行を実行し直す
End If
—
最後に:On Error GoTo 0 の哲学
最後に最も大切なことを伝えます。`On Error GoTo 0` は「監視の強制解除」です。
`On Error Resume Next` を使った後は、必ず `On Error GoTo 0` を書いてください。これを怠ると、後続のコードで発生した重大なエラーさえも「無視」され、気づかぬうちにデータが破壊されるという最悪のバグを生みます。
「監視を開始したら、責任を持って解除する」。
この作法こそが、あなたが「マクロの記録」を卒業し、真のエンジニアへと脱皮した証です。
—
まとめ:ここをクリアすれば大丈夫!
1. `On Error GoTo 〇〇` でエラーの逃げ道を作る。
2. `Exit Sub` で正常ルートとエラールートを完全に分ける。
3. `On Error GoTo 0` で監視を止めることを忘れない。
エラーは「敵」ではありません。エラーは「あなたの書いたコードが、限界に達したことを教えてくれるサイン」です。そのサインを正しく拾い上げ、ユーザーに優しく伝える。それだけで、あなたのVBAライフは劇的に安定します。
さあ、恐れずにコードを書きましょう。あなたのマクロが、誰かの業務を救うその日まで。
