エラーに負けない!VBAマクロを安定稼働させるエラーハンドリング術【サンプルコード付き】

【業務効率化】VBA
スポンサーリンク

こんにちは!ぐーです。
いつもブログをご覧いただき、ありがとうございます!

突然ですが、VBAマクロを作っていて、こんな「冷や汗」をかいた経験はありませんか?

  • 「よし、できた!使ってみよう!」→ まさかの実行時エラーで赤画面に…。
  • 自分以外の人に使ってもらったら、「なんかエラー出て止まっちゃったよ」と報告され、顔から火が出る思いをした。
  • エラーが出ても、何が原因なのかさっぱりで、結局マクロを使うのをやめてしまった…。

「どうせ私なんかが作っても…」と、ネガティブになってしまう。その気持ち、痛いほど分かります。私も昔はそうでした。

この記事は、そんな「VBAエラーの恐怖」から解放するための記事です。

せっかく作ったマクロを「怖い」ものから「頼れる相棒」に変えるための、「エラーハンドリング」という”お守り”のような技術について、分かりやすく解説します。

【業務効率化】VBAの記事を見る


そもそも「エラーハンドリング」って何?

一言でいうと、「もしエラーが起きたら、どうするかをあらかじめ決めておくこと」です。

マクロが予期せぬ事態(例えば、開くはずのファイルが無い、数値を入力すべきセルに文字が入っている)に遭遇したとき、VBAは「もう無理!」と処理を強制停止してしまいます。これが、あの忌々しい「実行時エラー」です。

エラーハンドリングは、この「強制停止」を防ぐための保険。「もしエラーが起きても、パニックにならずに、これを実行してね」とVBAに指示を与えておくのです。


🛡️ なぜエラーハンドリングが必要なのか?

これを導入するメリットは、大きく3つあります。

  1. マクロが途中で止まる最悪の事態を防げる
    これが最大のメリットです。エラーが出ても処理が止まらなければ、利用者に「あのマクロ、使えない」と烙印を押されることが激減します。
  2. 利用者に「優しい」エラー通知ができる
    「実行時エラー ‘1004’」なんて言われても、専門知識がない人からしたら、ただの暗号ですよね。
    「エラーハンドリング」を使えば、「(A列の)○○セルに数字以外が入っています。確認してください」といった具体的なメッセージを利用者に出すことができます。
  3. あなたのデバッグ(修正)時間が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

実行するとこのメッセージが出ます。通常のエラーメッセージよりかなり分かりやすく、親切ですよね。

こんなふうにエラーハンドリングが出来れば、エラーが発生した際もある程度コントロールできるようになります。

💡 このコードの「キモ」

  1. On Error GoTo ErrorHandler
    「今からエラーの保険をかけます。もし何かあったら、ErrorHandler:という目印(ラベル)のところまで飛んでください」という宣言です。
  2. Exit Sub
    これが一番重要です! もしこれが無いと、正常に処理が終わった場合でも、そのままエラー処理(ErrorHandler:以降)が実行されてしまいます。
    「正常に終わったら、ここで Sub を抜けてね」という命令です。
  3. ErrorHandler:
    エラーが起きた時の避難場所です。:(コロン)を忘れないでください。
  4. 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の記事を見る


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を厳選して紹介します。 もう本選びで失敗したくない方は、ぜひ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でも、年間100万円以上の節約・資産管理・スキルアップで新NISAで年間360万円投資し、iDeCoもフル活用しています。日商簿記3級持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、稼ぐ力を高めるITスキルについて発信しています。

生活を豊かにしたくて、高配当株投資で年間配当金60万円をめざしています。現在は年間配当金25万円以上達成!

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

タイトルとURLをコピーしました