VBAデバックのやり方がわからない初心者必見!エラーを潰す5つの手順

VBAを書いてみたのに、実行したら急に赤いエラーメッセージが出てパニックになったことはありませんか?

 

「どこが間違っているのかわからない」「ネットで調べても専門用語ばかりで意味がわからない」という経験は、VBA学習を始めたほぼ全ての人が通る道です。

私もVBAを独学で勉強し始めたころ、エラーが出るたびに途方に暮れていました。

 

しかし、デバックのやり方をひとつひとつ覚えてからは、エラーが出ても慌てなくなった。

むしろ「このエラーはどこを直せばいい?」と、落ち着いて原因を特定できるようになっています。

 

この記事では、VBAデバックのやり方を初心者の方でも理解できるよう、5つの手順に分けてわかりやすく解説します。

読み終えるころには「デバックってこんなに簡単だったの!」と感じていただけるはずです。

 

目次

広告

VBAのデバックとは何か?初心者が最初に知るべき基本

VBAのデバック(デバッグ)とは、プログラムの中にあるエラーや不具合の原因を見つけて修正する作業のことです。

「バグ」とはプログラムの不具合のことで、それを取り除く(デバッグする)作業がデバックと呼ばれています。

 

VBAを書いているとき、コードが長くなるほどエラーが起きやすくなります。

だからこそ、デバックのやり方を知っておくことは、VBA学習を進める上で避けて通れないスキルです。

 

ここでは、初心者がまず知っておくべきデバックの基本を整理します。

 

VBAのエラーは大きく3種類ある

VBAのエラーは、次の3種類に分類されます。

 

1つ目は「コンパイルエラー」は、コードの書き方そのものが間違っているときに発生します。

たとえば、「End If」が抜けていたり、変数の宣言を間違えたりしたときに表示されるエラーです。

VBAを実行しようとした瞬間、またはVBEで「デバッグ→コンパイル」を選んだときに検出されます。

 

2つ目は「実行時エラー」は、コードの書き方は正しいけれど、実行中に問題が起きたときに発生します。

「存在しないシートを指定した」「0で割り算しようとした」「数値であるべきセルに文字が入っていた」といったケースが代表的です。

 

3つ目は「論理エラー」は、エラーメッセージは出ないけれど処理の結果がおかしい場合です。

「計算式は正しいと思っていたのに、合計値が違う」「ループの終わり方が間違っていて一部のデータが処理されなかった」といったケースが当てはまります。

 

論理エラーはエラーメッセージが表示されないため、3種類の中でもっとも発見しにくいエラーなので注意しましょう。

 

エラーメッセージを正しく読む習慣をつける

VBAでエラーが発生すると、画面に黄色いダイアログボックスが表示されます。

こんな感じ

エラー発生画面

 

そのメッセージを「なんとなく閉じる」のではなく、内容を読む習慣をつけることが、デバックの第一歩です。

 

よく見かけるエラーメッセージと意味をまとめると、次のようになります。

 

  • 「実行時エラー '9’:インデックスが有効範囲にありません」は、存在しないシート名や配列の範囲外にアクセスしようとしたときに出るエラー
  • 「実行時エラー '1004’:アプリケーション定義またはオブジェクト定義のエラーです」は、セルやシートの指定方法が間違っているときによく出るエラー
  • 「実行時エラー ’13’:型が一致しません」は、数値を扱う変数に文字列が入っているときなど、データの型が合っていないときに出るエラー

 

エラーメッセージが表示されたとき、まずは「デバッグ」ボタンをクリックしましょう。

エラーが発生した行が黄色くハイライトされるため、問題のある場所をすぐに特定できます。

 

VBE(Visual Basic Editor)の基本画面を覚える

デバックをスムーズに行うには、VBE(Visual Basic Editor)の画面構成を把握しておくことが重要です。

VBEはエクセルで「ALT+F11」キーを押すことで開けます。

標準モジュールの作り方

 

主に使う画面は「コードウィンドウ」「イミディエイトウィンドウ」「ウォッチウィンドウ」の3つです。

 

コードウィンドウはVBAコードを書くメインのエリアで、エラーが発生するとここに黄色いハイライトが表示されます。

イミディエイトウィンドウは、変数の中身をリアルタイムで確認したり、簡単な計算を実行したりできる場所です。

ウォッチウィンドウは、特定の変数の値を常に監視しながらコードを実行できる機能で、複雑なループ処理をデバックするときに特に役立ちます。

ウィンドウの開き方

 

この3つの画面の使い方を理解するだけで、デバックの効率が大きく変わります。

 

VBAデバックの基本手順5ステップ

エラーが起きたとき、慌てずに済む「デバックの手順」があります。

私が独学でVBAを習得する過程でたどり着いた、初心者でも実践しやすい5つのステップを紹介します。

この流れを身につけるだけで、エラーが出るたびに途方に暮れることがなくなります。

 

ステップ1|F8キーで1行ずつ実行してエラー箇所を特定する

VBAデバックの中でもっとも基本的で効果的な方法が、「F8キーを使った1行実行(ステップ実行)」です。

VBEを開いた状態で「F8」キーを押すと、コードが1行ずつ実行されます。

F8で実行

 

現在実行中の行が黄色くハイライトされるため、「どの行まで処理が進んでいるか」が一目でわかります。

 

次のような簡単なコードで試してみましょう。

Sub デバックテスト()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

Dim i As Long
For i = 1 To 5
ws.Cells(i, 1).Value = i * 10
Next i

MsgBox "処理が完了しました。"

End Sub

 

このコードをVBEに貼り付け、F8キーを押すと「Sub デバックテスト()」の行が黄色くなります。

もう一度F8を押すと次の行に進み、さらに押すと「Set ws =」の行が実行されます。

ループの中でF8を繰り返し押すと、「i = 1」「i = 2」と変数の値が変わりながらループが進んでいく様子を確認できます。

 

どこでエラーが起きたのかが一目瞭然になるため、長いコードのどこに問題があるかをピンポイントで特定することが可能。

 

ステップ2|イミディエイトウィンドウで変数の中身を確認する

F8キーで実行を一時停止したとき、「変数にどんな値が入っているか」を確認したいことがよくあります。

 

そのために使うのが「イミディエイトウィンドウ」です。

 

VBEのメニューから「表示→イミディエイトウィンドウ」を選ぶか、「Ctrl+G」で開くことができます。

イミディエイトウィンドウを使うには、コードの中に「Debug.Print」を追加するのが一番簡単な方法です。

 

先ほどのコードに Debug.Print を追加してみましょう。

Sub デバックテスト_Debug版()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

Dim i As Long
For i = 1 To 5
Debug.Print "i の値:" & i          ' i の値を出力
Debug.Print "セルに入れる値:" & i * 10  ' 計算結果を出力
ws.Cells(i, 1).Value = i * 10
Next i

MsgBox "処理が完了しました。"

End Sub

 

このコードを実行すると、イミディエイトウィンドウに「i の値:1」「セルに入れる値:10」…と順番に表示されます。

イミディエイトウィンドウの表示画面

 

「ループの何回目でおかしな値になったか」「変数に想定外の値が入っていないか」を確認するのに、Debug.Print は非常に役立ちます。

Debug.Print で確認が終わったら、コードから削除するかコメントアウト(’を頭につける)しておきましょう。

 

ステップ3|ウォッチ式で変数を常時監視する

イミディエイトウィンドウに都度 Debug.Print を書くのが面倒な場合は、「ウォッチ式」を使う方法もあります。

ウォッチ式を設定すると、F8キーでコードを1行ずつ実行するとき、指定した変数の値がウォッチウィンドウにリアルタイムで表示されます。

 

設定方法は次の通りです。

まず、VBEのメニューから「デバッグ→ウォッチ式の追加」を選びます。

「ウォッチ式の追加」ダイアログが表示されたら、「式」に監視したい変数名(例:i)を入力して「OK」をクリックします。

すると、ウォッチウィンドウに変数 i の欄が追加されます。

 

F8キーでコードを1行ずつ実行すると、i の値がリアルタイムで更新されていきます。

ウォッチウィンドウの表示画面

 

「このループ、途中で想定外の値になっていないか?」「条件分岐でどちらに分かれているか?」をチェックするのに最適な機能です。

私が独学でVBAを習得できたのは、F8キーとウォッチ式の組み合わせで「コードが実際にどう動いているか」を目で確認しながら学習できたからです。

 

ステップ4|ブレークポイントで止めたい行を指定する

「最初の方の行は問題ない。エラーが起きているのはどこか特定の行より後のはず…」という場合は、「ブレークポイント」が便利です。

 

ブレークポイントとは、コードの実行を一時停止させたい行を指定する機能です。

 

設定方法は、VBEのコードウィンドウで停止させたい行の左端(グレーの縦帯)をクリックするだけです。

クリックした行に赤い丸が表示され、そこがブレークポイントとして設定されます。

ブレークポイント使用画面

 

マクロを実行すると、ブレークポイントの手前まで通常通り実行され、その行に来た瞬間に処理が一時停止します。

一時停止した状態でF8キーを押せば、そこから1行ずつ実行可能。

 

「最初からF8でステップ実行すると時間がかかる」という場合に、ブレークポイントと組み合わせると効率よくデバックできます。

ブレークポイントを解除するには、設定時と同じ要領で赤い丸の部分をクリックしてください。

 

よく起きるVBAのエラーと原因・解決方法

デバックの手順を覚えたら、次は「よく起きるエラーのパターン」を知っておくことが重要です。

エラーのパターンを知っていれば、エラーメッセージを見た瞬間に「原因はあそこだな」と当たりをつけられるようになります。

ここでは、私が年間50件程度のマクロ開発を受注する中でよく遭遇するエラーパターンを紹介します。

 

「実行時エラー '9’」が出たときの原因と対処

「インデックスが有効範囲にありません」というメッセージで表示されるこのエラーは、主にシート名の指定ミスや配列の範囲外アクセスが原因です。

 

代表的なのが、次のようなコードです。

Sub シート指定エラーの例()

Dim ws As Worksheet
' ↓ シート名が間違っている場合にエラーが起きる
Set ws = ThisWorkbook.Worksheets("データ一覧")
ws.Cells(1, 1).Value = "テスト"

End Sub

 

このコードを実行したとき、もしエクセルファイルの中に「データ一覧」というシートが存在しなければ、実行時エラー '9’ が発生します。

対処法は、まず「シート名が正しいか」を確認することです。

 

全角・半角スペースの違いや、見えにくい半角スペースが末尾に入っている、などを確認してください。

 

確実にシート名を確認するには、イミディエイトウィンドウに次のコードを入力して実行する方法があります。

For Each ws In ThisWorkbook.Worksheets : Debug.Print ws.Name : Next ws

 

このコードを実行すると、ブック内のすべてのシート名がイミディエイトウィンドウに表示されるので便利です。

 

「実行時エラー ’13’」が出たときの原因と対処

「型が一致しません」というこのエラーは、変数に想定していないデータ型が入っているときに発生します。

 

よくある原因は、数値を入れるつもりの変数(Long 型など)に、文字列や空白セルの値を代入しようとしているケースです。

 

Sub 型エラーの例()

Dim goukei As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

' ↓ セルに文字列や空白が入っているとエラーが起きる
goukei = ws.Cells(1, 1).Value

MsgBox "合計:" & goukei

End Sub

 

対処法のひとつは、「IsNumeric関数」で数値かどうかを確認してから代入する方法です。

 

Sub 型エラー対策版()

Dim goukei As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

' 数値かどうかを確認してから代入する

If IsNumeric(ws.Cells(1, 1).Value) Then
goukei = ws.Cells(1, 1).Value
MsgBox "合計:" & goukei
Else
MsgBox "セルに数値が入っていません。確認してください。"
End If

End Sub

 

この「確認してから処理する」という考え方は、エラーを防ぐ上でとても重要です。

 

エラーが出ないのに結果がおかしい「論理エラー」の対処

論理エラーは、エラーメッセージが一切表示されないため、もっとも発見が難しいエラーです。

「ループが想定した回数だけ動いていない」「条件分岐の結果がおかしい」といった問題は、Debug.Print でループ変数や条件判定の結果を出力しながら確認しましょう。

 

Sub 論理エラー確認の例()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
Debug.Print "最終行:" & lastRow  ' 最終行を確認

Dim i As Long
For i = 2 To lastRow
Debug.Print "処理中の行:" & i & " / 値:" & ws.Cells(i, 1).Value

' 条件分岐の判定結果も確認
If ws.Cells(i, 2).Value > 100 Then
Debug.Print "→ 条件成立(100より大きい)"
Else
Debug.Print "→ 条件不成立(100以下)"
End If
Next i

End Sub

 

このように Debug.Print を要所に挟むことで、「どの行でどんな値が処理されているか」「条件分岐はどちらに分かれているか」をイミディエイトウィンドウで確認できます。

論理エラーの修正は「コードを読む」だけでなく「実際に動かして確認する」ことが重要です。

 

VBAデバックをもっと効率化するテクニック

基本的なデバックの手順を覚えたら、次のテクニックを使うとさらにデバック作業が速くなります。

ここで紹介する方法は、私が実際にマクロ開発の現場で日常的に使っているものです。

 

On Error GoToでエラー情報をメッセージに表示する

デバック中は「どんなエラーが起きたのか」の情報をなるべく詳しく知りたいものです。

「On Error GoTo」を使うと、エラーが発生した際に専用の処理(エラーハンドラー)を呼び出せます。

 

Sub エラーハンドラーの例()

On Error GoTo ErrorHandler  ' エラーが起きたらErrorHandlerへ飛ぶ

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("存在しないシート")  ' わざとエラーを起こす
ws.Cells(1, 1).Value = "テスト"
Exit Sub  ' 正常終了したらここでSubを抜ける

ErrorHandler:
' エラー番号とメッセージを表示する
MsgBox "エラーが発生しました。" & vbCrLf & _
"エラー番号:" & Err.Number & vbCrLf & _
"エラー内容:" & Err.Description, vbCritical

End Sub

 

このコードを実行すると、エラー発生時にエラー番号と内容がメッセージボックスに表示されます。

 

「実行時エラー '9’:インデックスが有効範囲にありません」のような情報が表示されるため、原因の特定が格段に速くなります。

開発中のマクロにはこのエラーハンドラーを追加しておき、完成したら必要に応じて削除または簡略化するのがおすすめです。

 

コメントアウトで処理を一時的に無効化する

「この行が原因かもしれない」と思ったとき、その行を削除せずに一時的に無効化する方法が「コメントアウト」です。

コメントアウトするには、行の先頭に「’(シングルクォーテーション)」を追加するだけ。

 

Sub コメントアウトの例()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")

' ↓ この行を一時的に無効化してテストする
' ws.Cells(1, 1).Value = "テスト値"
ws.Cells(1, 2).Value = "別の処理"
MsgBox "実行完了"

End Sub

 

「コメントアウト→実行→動作確認→コメントアウト解除→再実行」を繰り返すことで、どの行がエラーの原因かを効率よく絞り込むことができます。

VBEでは複数行をまとめてコメントアウトする機能(ツールバーの「コメントブロック」ボタン)もあるため、ぜひ活用しましょう。

 

デバックで詰まったときの考え方|VBAプロが実践する思考法

デバックの技術を覚えることも大切ですが、「エラーを前にしたときの考え方」も同じくらい重要です。

私がVBAを独学で習得できた背景には、エラーと向き合うときの考え方の変化がありました。

 

「エラーは正しい方向を教えてくれるナビゲーター」だと思う

VBAを始めたばかりのころ、エラーメッセージが出るたびに「また失敗した」と落ち込んでいました。

しかし経験を積む中で学んだことは、エラーは「ここが間違っているよ」と教えてくれる道標だということ。

 

エラーメッセージをきちんと読み、F8キーで1行ずつ動作を確認するクセをつければ、たいていのエラーは30分以内に解決できます。

「エラーが出た=失敗」ではなく「エラーが出た=原因を見つけるチャンス」という意識に切り替えるだけで、学習の速度は大きく変わります。

 

意味がわからなくてもまずコードを動かしてみることが最速の学習法

「このコードが何をしているか完全に理解してから次に進もう」という考え方は、実はVBA学習では遠回りになりがちです。

私が実践した最速の学習法は、「まずコードをそのまま入力して動かし、F8キーで1行ずつ実行して何が起きているかを目で確認する」というものでした。

 

100%理解してから動かすのではなく、「動かしながら理解する」のです。

 

ネットや参考書に掲載されているサンプルコードを手入力して、F8でひとつひとつ動作を確認するだけで、変数の使い方・ループの流れ・条件分岐の動き方が自然と身についていきます。

実際に、何百枚もの写真を手作業で編集するエクセル業務を自動化するマクロを開発できたとき、F8キーとイミディエイトウィンドウを駆使して何度もデバックを繰り返した経験が、その後のあらゆるマクロ開発の土台になっていました。

 

関連記事「写真の貼付けを完全自動化」では、VBA学習をスタートさせて間もない頃に開発した「写真貼り付けマクロ」をダウンロードすることができます。

 

 

実際にマクロを動かしてどんな動きをするのかチェックしてみてください。

 

デバックの力が上がると、マクロ開発の幅が一気に広がる

デバックのやり方を身につけた結果、私が開発できるようになったマクロは劇的に増えました。

 

契約書を自動作成するマクロ、スケジュール管理を自動化するマクロ、電気設備検査表を自動作成するマクロ、勤務整理を自動化するマクロなど、業務に合わせたオーダーメイドマクロをいくつも開発できるように。

 

オーダーメイドマクロを開発できるようになれば、「個人でマクロ開発案件を受注」 → 「収入を得る」ことだって可能です。

 

関連記事「VBAスキルで副収入を得る方法」では、独学でVBAスキルを身に付けた私が個人で案件を受注するまでに至った流れを解説。

 

 

「VBAを使えるようになったら、仕事に活かしたい」と考えている方は、ぜひ参考にしてみてください。

 

まとめ ~ VBAデバックは手順を覚えれば怖くない ~

VBAのデバックが難しく感じる最大の理由は、「何をすればいいかわからない」という手順の不明確さにあります。

 

この記事で紹介した5つのステップをまとめると、

エラーが出たらまずエラーメッセージの「デバッグ」ボタンを押してエラー行を確認し、F8キーで1行ずつ実行しながら問題の行を特定、Debug.Print やウォッチ式で変数の中身をリアルタイムに確認し、ブレークポイントで処理の途中から動作確認、On Error GoTo でエラー情報を記録する

という流れです。

 

この手順を繰り返すうちに、「エラーメッセージを見た瞬間に原因の当たりがつく」感覚が身についてきます。

 

VBAは、エラーを直すたびに確実に成長できるスキルです。

ぜひ今日からデバックの手順を実践し、マクロ開発の楽しさを体感してください。

 

もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。

 

 

業務内容に合わせたオーダーメイドマクロを設定させていただきます。

最後まで読んでいただきありがとうございました。