こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!
突然ですが、VBAマクロを作っていて、こんな「冷や汗」をかいた経験はありませんか?
- 「よし、できた!使ってみよう!」→ まさかの実行時エラーで赤画面に…。
- 自分以外の人に使ってもらったら、「なんかエラー出て止まっちゃったよ」と報告され、顔から火が出る思いをした。
- エラーが出ても、何が原因なのかさっぱりで、結局マクロを使うのをやめてしまった…。
「どうせ私なんかが作っても…」と、ネガティブになってしまう。その気持ち、痛いほど分かります。私も昔はそうでした。
この記事は、そんな「VBAエラーの恐怖」から解放するための記事です。
せっかく作ったマクロを「怖い」ものから「頼れる相棒」に変えるための、「エラーハンドリング」という”お守り”のような技術について、分かりやすく解説します。
そもそも「エラーハンドリング」って何?
一言でいうと、「もしエラーが起きたら、どうするかをあらかじめ決めておくこと」です。
マクロが予期せぬ事態(例えば、開くはずのファイルが無い、数値を入力すべきセルに文字が入っている)に遭遇したとき、VBAは「もう無理!」と処理を強制停止してしまいます。これが、あの忌々しい「実行時エラー」です。
エラーハンドリングは、この「強制停止」を防ぐための保険。「もしエラーが起きても、パニックにならずに、これを実行してね」とVBAに指示を与えておくのです。
🛡️ なぜエラーハンドリングが必要なのか?
これを導入するメリットは、大きく3つあります。
- マクロが途中で止まる最悪の事態を防げる
これが最大のメリットです。エラーが出ても処理が止まらなければ、利用者に「あのマクロ、使えない」と烙印を押されることが激減します。 - 利用者に「優しい」エラー通知ができる
「実行時エラー ‘1004’」なんて言われても、専門知識がない人からしたら、ただの暗号ですよね。
「エラーハンドリング」を使えば、「(A列の)○○セルに数字以外が入っています。確認してください」といった具体的なメッセージを利用者に出すことができます。 - あなたのデバッグ(修正)時間が90%削減できる
エラーが起きたとき、どの処理で、何が原因でエラーになったかを記録しておくことができます。これがあるだけで、エラーの原因特定にかかる時間が劇的に短くなります。
【コピペOK】王道のエラーハンドリング「On Error GoTo」
VBAにはいくつかエラーハンドリングの方法がありますが、初心者がまず覚えるべきなのは「On Error GoTo ラベル」という構文です。
これは、「もし(これ以降の処理で)エラーが発生したら、(指定した場所)にジャンプしてね」という意味です。
📝 基本の型(コピペ用)
まずはこの「型」を使ってみましょう。
Sub SampleMacro()
' ■■■ 保険をかける(エラーハンドリング開始) ■■■
On Error GoTo ErrorHandler
' --- ここから本来の処理 ---
Dim a As Integer
Dim b As Integer
Dim c As Double
a = 10
b = 0 ' ← わざとエラーを起こす(0除算)
c = a / b ' ← ここでエラーが発生!
MsgBox "処理が正常に完了しました。" ' ← エラーが起きるとここは実行されない
' --- 本来の処理ここまで ---
' ■■■ 正常終了時は、エラー処理を飛ばす ■■■
Exit Sub
' ■■■ エラーが起きた時のジャンプ先 ■■■
ErrorHandler:
' ここに、エラーが起きた時の処理を書く
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description
' On Error GoTo 0 ' エラーハンドリングをリセット(必要に応じて)
End Sub
実行するとこのメッセージが出ます。通常のエラーメッセージよりかなり分かりやすく、親切ですよね。

こんなふうにエラーハンドリングが出来れば、エラーが発生した際もある程度コントロールできるようになります。
💡 このコードの「キモ」
- On Error GoTo ErrorHandler
「今からエラーの保険をかけます。もし何かあったら、ErrorHandler:という目印(ラベル)のところまで飛んでください」という宣言です。 - Exit Sub
これが一番重要です! もしこれが無いと、正常に処理が終わった場合でも、そのままエラー処理(ErrorHandler:以降)が実行されてしまいます。
「正常に終わったら、ここで Sub を抜けてね」という命令です。 - ErrorHandler:
エラーが起きた時の避難場所です。:(コロン)を忘れないでください。 - Err.Number / Err.Description
VBAがあらかじめ用意してくれている変数です。
- Err.Number: エラー番号(11なら「0で除算」など)
- Err.Description: エラーの具体的な内容(「0で除算しました。」など)
これを MsgBox で表示するだけで、「何が起きたか」が明確になり、修正が格段に楽になりますよね。
🙅♂️ やってはいけない?「On Error Resume Next」
もう一つ、「On Error Resume Next」という構文があります。
これは「もしエラーが起きても、無視して次の行に進みなさい」という、かなり強引な命令です。
Sub BadSample()
' エラーを無視する
On Error Resume Next
Dim a As Integer
Dim b As Integer
Dim c As Double
a = 10
b = 0
c = a / b ' ← エラーが発生するが、無視して次へ進む
' c には何も入っていない(または不正な値)のに、処理が続いてしまう…
MsgBox "cの値は " & c & " です。" ' ← 意図しない結果になる!
End Sub

一見、マクロが止まらなくなるので便利そうですが、これはエラーを「隠蔽」しているだけです。
本当は計算できていないのに、できたフリをして処理が進むため、最終的にもっと重大なバグやデータの不整合を引き起こします。
「絶対にエラーが起きても問題ない」と100%確信できる場面(例:特定のシートが無くてもいい、など)以外では、絶対に使わないようにしましょう。
万一、メール送信やシステムにログインするようなマクロに「On Error Resume Next」を使っていたら、個人情報を流出させてしまうリスクもありますので、くれぐれもお気をつけください。
🌟 まとめ:エラーを恐れず、自信を持とう
エラーハンドリングは、慣れればそこまで難しいテクニックではありません。
「転ばぬ先の杖」を用意しておく、みたいな感じです。
この数行書き加えるだけで、あなたのマクロは「時々止まる怖いもの」から「何かあっても安全に動く頼れる相棒」に変わります。
さらに安全性を高めたい場合は、処理履歴などを記録するように改良することも可能です。
「エラーが出たらどうしよう…」とネガティブに考える必要はもうありません。
「エラーが出ても、ちゃんと対応できるようにしてあるから大丈夫」この安心感が、自信につながっていきます。
ぜひ、次回マクロを作るとき、この「On Error GoTo」というお守りを組み込んでみてください!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、ぜひ参考にしてみてください。

コメント