ExcelマクロのVBAデバッグ方法|ブレークポイントから変数確認まで

スポンサーリンク

VBAでマクロを書き始めると、誰もが必ず「実行したのに動かない」「エラーは出ないのに結果がおかしい」という壁にぶつかります。コードを何度見直しても原因がわからず、MsgBox をあちこちに仕込んでは消して、を繰り返した経験はありませんか。

その「とりあえず MsgBox」のやり方は、実はとても効率が悪いんです。原因の見当がついていない段階で当てずっぽうに値を表示しても、たいていは見当違いの場所を見ているだけです。そうして時間ばかりが溶けていきます。終わったら表示用のコードを消し忘れて、本番でいきなりメッセージが出る、なんて事故も起きがちですよね。

VBEには、こうした調査を専用にこなす「デバッグツール」が最初から備わっています。ブレークポイントでコードを途中で止め、1行ずつ実行し、変数の中身をその場で確認する。この一連の流れを覚えるだけで、「動かない」の原因特定は驚くほど速くなりますよ。

この記事では、ブレークポイント(F9)とステップ実行(F8)を軸に解説します。さらに、ローカル・ウォッチ・イミディエイトの3ウィンドウの使い分けまでを通しで紹介します。「症状からツールを選ぶフローチャート」と「エラーは出ないのに結果がずれる論理エラーの実践シナリオ」も用意しました。毎回 MsgBox を仕込むやり方から、今日で卒業しましょう。

なお、本記事は Microsoft 365 / Excel 2021 / 2019 の VBE を前提にしています。メニュー名は日本語版Excelの表記に合わせていますが、お使いの環境で多少異なる場合は読み替えてくださいね。

  1. VBAデバッグとは何か|なぜ必要なのか
    1. デバッグが必要な2パターン(エラーで止まる/結果がおかしい)
    2. MsgBoxだけに頼るデバッグの限界
  2. デバッグ4ステップ・フローチャート|症状別ツール選択ガイド
    1. 症状1:実行時エラーで止まる場合
    2. 症状2:エラーは出ないが結果がおかしい(論理エラー)の場合
    3. 症状3:無限ループ・処理が終わらない場合
  3. ブレークポイントの設定と解除方法(F9)
    1. ブレークポイントの設定手順
    2. 複数箇所への設定と一括クリアの方法
    3. ブレークポイントを使うべきシーン
  4. ステップ実行で1行ずつ処理を追う(F8)
    1. ステップイン・ステップオーバー・ステップアウトの違い
    2. ステップ実行とブレークポイントの組み合わせ方
  5. 変数の中身を確認する3つのウィンドウ
    1. ローカルウィンドウ|全変数を一覧で確認
    2. ウォッチウィンドウ|条件付き中断で特定変数を監視
    3. イミディエイトウィンドウ|Debug.Printでその場確認
  6. デバッグツール使い分け早見表
  7. 実践シナリオ|論理エラーを追う手順(合計行スキップ問題)
    1. Step1:ブレークポイントでループ前に止める
    2. Step2:F8ステップ実行で処理を1行ずつ追う
    3. Step3:ローカルウィンドウでカウンタ変数を確認
    4. Step4:問題箇所の特定と修正
  8. まとめ|デバッグを習慣にして「動かない」を素早く解決しよう
    1. 各ツールの詳細は専門記事へ

VBAデバッグとは何か|なぜ必要なのか

デバッグとは、ひとことで言えば「バグ(不具合)の原因を突き止めて直す作業」です。VBAにおいては、書いたコードがなぜ意図どおりに動かないのかを調査し、修正するまでの一連のプロセスを指します。

ここで大事なのは、VBAのエラーには種類があり、種類によって対処の入り口が変わるという点です。Microsoftの公式分類では、VBA(Visual Basic)のエラーは次の3種類に分かれます。

  1. 構文エラー(コンパイルエラー): コードの書き方そのものが間違っているエラーです。実行前にVBEが検出します。
  2. 実行時エラー: マクロを動かした途中で発生するエラーです。「実行時エラー 1004」などがこれにあたります。
  3. 論理エラー: エラーメッセージは出ないのに、処理結果が意図と違うバグです。

構文エラーは実行する前にVBEが指摘してくれるので、比較的気づきやすい部類です。やっかいなのは残りの2つ、つまり「実行時エラーで止まる」場合と「論理エラーで結果がずれる」場合です。この記事のデバッグツールは、まさにこの2パターンの原因調査に効きます。

デバッグが必要な2パターン(エラーで止まる/結果がおかしい)

デバッグツールを使う場面は、大きく2パターンに分けられます。この区別を意識しておくと、後で紹介するツール選びがぐっと楽になりますよ。

1つ目は「実行時エラーで止まる」パターンです。マクロを実行すると赤い画面が出て、特定の行が黄色くハイライトされた状態で止まります。この黄色い行が、エラーが起きた場所です。

2つ目は「エラーは出ないが結果がおかしい」パターン、いわゆる論理エラーです。マクロは最後まで普通に動くのに、合計が合わない、転記先が1行ずれている、といった症状が出ます。エラーが出ない分、どこが悪いのか見当をつけにくく、デバッグツールの真価が問われる場面です。

止まる場合は「止まった場所」が手がかりになります。止まらない場合は「処理を1行ずつ追って、おかしくなる瞬間を捕まえる」必要があります。アプローチが違うので、まずは自分がどちらの状況かを見極めてくださいね。

なお、実行時エラーの番号別の直し方(エラー13・1004・9など)については、VBAマクロのエラー解決ガイドで原因と修正コードをセットでまとめています。本記事の「調査ツールの使い方」と、エラーガイドの「番号別の直し方」は補完関係にあるので、あわせて読むと対応力が上がりますよ。

MsgBoxだけに頼るデバッグの限界

VBAを始めたばかりの頃は、変数の中身を確認したいときに MsgBox を使う人が多いと思います。たとえば次のように書くわけです。

Sub MsgBoxデバッグの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 10
        合計 = 合計 + Cells(i, 1).Value
        MsgBox "i=" & i & " / 合計=" & 合計  '確認用に値を表示
    Next i
End Sub

このやり方でも値は確認できます。ただ、ループが10回まわれば10回ダイアログが出るので、そのたびにOKを押す手間がかかります。確認したい変数が増えるたびに MsgBox を書き足すことになり、コードがどんどん汚れていきます。

さらに困るのが、消し忘れです。デバッグが終わったあとに削除し忘れると、本番運用中にいきなりメッセージボックスが出て処理が止まります。共有ファイルなら、他の人を巻き込んだ事故にもなりかねません。

VBE標準のデバッグツールなら、コード本体に手を加えずに値を確認できます。確認用のコードを書かないので、消し忘れの事故も起きません。MsgBox方式から卒業する価値は十分にありますよ。

デバッグ4ステップ・フローチャート|症状別ツール選択ガイド

「ツールがたくさんあるのはわかったけど、結局どれから使えばいいの?」というのが、最初のつまずきポイントだと思います。そこで、症状からツールを選ぶ判断の流れを整理しました。

【デバッグ・ツール選択フローチャート】

(1) 症状を確認する
     │
     ├─ 赤い画面で止まる(実行時エラー)
     │        ↓
     │   止まった行と変数を見る
     │   → ローカルウィンドウで変数一覧を確認
     │   → エラー番号で原因を特定
     │
     ├─ エラーは出ないが結果がおかしい(論理エラー)
     │        ↓
     │   ブレークポイント(F9)で処理の手前に止める
     │   → ステップ実行(F8)で1行ずつ追う
     │   → ローカル/ウォッチで変数の変化を監視
     │
     └─ 処理が終わらない(無限ループ)
              ↓
          Ctrl+Break で強制中断
          → ステップ実行(F8)でループ条件を確認

このフローの肝は、「症状で入り口が決まる」という点です。止まるならまず止まった場所を見る、止まらないならブレークポイントで自分から止める。まずはこの大枠を頭に入れてくださいね。

それぞれの症状について、もう少し具体的に見ていきましょう。

症状1:実行時エラーで止まる場合

実行時エラーが出ると、エラーメッセージのダイアログが表示され、「デバッグ」ボタンを押すと該当行が黄色くハイライトされます。この黄色い行が、エラーが起きた場所です。

まずやるべきは、止まった行の周辺で使われている変数の中身を確認することです。ここで活躍するのがローカルウィンドウです。現在のプロシージャの全変数とその値が一覧で表示されるので、「想定外の値が入っている変数」を探します。

たとえば、シート名を変数で指定していて「インデックスが有効範囲にありません(実行時エラー 9)」で止まったとします。このときローカルウィンドウを見れば、変数に想定と違うシート名が入っていた、というケースがすぐ見つかります。

止まった場所と変数の中身、この2つがそろえば原因の大半は特定できます。エラー番号ごとの代表的な原因はエラー解決ガイドで確認してみてくださいね。

症状2:エラーは出ないが結果がおかしい(論理エラー)の場合

論理エラーは、エラーが出ない分だけ手強い相手です。マクロは正常終了するのに、合計が1件分足りない、転記先が1行ずれる、といった「結果のずれ」だけが残ります。

この場合、エラーで止まってくれないので、自分から処理を止めにいく必要があります。手順はこうです。まずブレークポイント(F9)で怪しい処理の手前に止めます。次にステップ実行(F8)で1行ずつ進めながら、変数の値がおかしくなる瞬間を捕まえます。

「どこで値がおかしくなるか」を一発で見つけたいときは、ウォッチウィンドウの条件付き中断も使えます。特定の変数が想定外の値になった瞬間に自動で止める、という芸当が可能です。詳しくは後半の実践シナリオで実演しますね。

論理エラーは、エラーガイドのようなエラー番号別の対処では拾えない領域です。だからこそ、ステップ実行と変数確認の組み合わせが武器になりますよ。

症状3:無限ループ・処理が終わらない場合

「実行ボタンを押したまま、いつまでも処理が終わらない」という症状もよくあります。多くの場合、Do ~ LoopFor の終了条件が満たされず、ループが回り続けているのが原因です。

このときは、まず実行を止めなければ調査できません。Ctrl + Break を押すと、実行中のマクロを手動でブレークモードに切り替えられます。止まったら、ループのカウンタ変数や終了条件の変数をローカルウィンドウで確認します。

たとえば、カウンタを増やすはずの行が抜けていて、条件が永遠に満たされないというパターンです。止めて変数を見れば、「カウンタがずっと同じ値のままだ」とすぐわかります。

無限ループは「まず Ctrl+Break で止める」が合言葉です。止めてからステップ実行でループ条件を追えば、抜け出せない理由が見えてきますよ。

ブレークポイントの設定と解除方法(F9)

ブレークポイントは、デバッグの出発点とも言える機能です。指定した行でコードの実行を一時停止させ、その時点の変数や状態をじっくり確認できるようにします。

ブレークポイントの設定手順

ブレークポイントの設定方法は、公式に3通りあります。どれを使っても結果は同じなので、好きな方法で構いません。

  1. F9キー: 止めたい行にカーソルを置いて F9 を押します(メニューでは「デバッグ」→「ブレークポイントの設定/解除」)。
  2. マージンバーをクリック: コードウィンドウ左端のグレーの帯(マージンインジケーターバー)をクリックします。
  3. ツールバーボタン: デバッグツールバーのボタンから設定します。

設定すると、その行が赤茶色にハイライトされ、左端に丸い印が表示されます。この状態でマクロを実行すると、ブレークポイントの行に到達した瞬間に処理が止まります。

Sub ブレークポイントの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 10
        合計 = 合計 + Cells(i, 1).Value  ' ←この行にF9でブレークポイントを設定
    Next i

    MsgBox "合計は " & 合計
End Sub

上の例では、合計を加算する行にブレークポイントを置いています。実行するとループの1回目でこの行の直前で止まり、変数の中身を確認できる状態になります。

複数箇所への設定と一括クリアの方法

ブレークポイントは複数の行に同時に設定できます。処理の分岐ごとに置いておけば、「どのルートを通ったか」を確認するのに便利です。

1行だけ解除したいときは、その行で再度 F9 を押すか、マージンバーの丸印をもう一度クリックします。設定と解除が同じ操作なので、迷わないと思います。

すべてのブレークポイントを一括で消したいときは、Ctrl + Shift + F9 を押します(メニューでは「デバッグ」→「すべてのブレークポイントの解除」)。あちこちに設定して散らかったときは、これでまとめてリセットできますよ。

なお、ブレークポイントは1つ知っておくべき仕様があります。ファイルを保存しても保持されません。Excelを閉じて次回起動すると、ブレークポイントはすべて消えています。「保存したのに次の日には消えていた」と驚かないようにしてくださいね。

ブレークポイントを使うべきシーン

ブレークポイントが活きるのは、「処理のこのあたりが怪しい」と当たりがついている場面です。怪しい処理の手前に止めておけば、そこまでは一気に実行し、肝心の部分だけをじっくり調べられます。

逆に、どこが怪しいか全く見当がつかないときは、プロシージャの先頭にブレークポイントを置き、そこからステップ実行で順番に追っていく使い方になります。次の章で解説するステップ実行と組み合わせるのが王道です。

もう1つ、コード中に書き込むタイプの停止方法として Stop ステートメントもあります。これはブレークポイントと同じくブレークモードに切り替わりますが、コードに書いた文字なので保存後も残ります。便利な反面、デバッグが終わったら必ず削除しないと本番で止まってしまうので、扱いには注意してくださいね。

ステップ実行で1行ずつ処理を追う(F8)

ブレークポイントで処理を止めたら、次はステップ実行の出番です。ステップ実行とは、コードを1行ずつ実行しながら、各行で何が起きているかを目で追っていく操作のことです。

ブレークモードで F8 を押すと、ハイライトされている行が1行だけ実行され、次の行に黄色いハイライトが移ります。これを繰り返すことで、処理の流れと変数の変化を1行単位で観察できます。

ステップイン・ステップオーバー・ステップアウトの違い

ステップ実行には、似たような名前のコマンドが3つあります。違いを押さえておくと、調査がぐっと速くなりますよ。

  • ステップイン(F8): 最も基本のステップ実行です。1行ずつ実行し、別のプロシージャを呼び出している行ではその中にも入っていきます。最も細かく追える反面、呼び出し先が長いと時間がかかります。
  • ステップオーバー(Shift+F8): 呼び出し先のプロシージャを1ステップとしてまとめて実行し、中には入りません。「このサブプロシージャは正しく動くと確信している」ときに使います。
  • ステップアウト(Ctrl+Shift+F8): 今いるプロシージャの残りを一気に実行し、呼び出し元の次の行に戻ります。「中に入りすぎたので、ここはもう抜けたい」ときに便利です。

さらに、Ctrl + F8(カーソル行の前まで実行)も覚えておくと役立ちます。大きなループを途中まで飛ばしたいとき、見たい行にカーソルを置いてこれを押せば、そこまで一気に進めますよ。

Sub ステップ実行の親プロシージャ()
    Dim 結果 As Long
    結果 = 二乗を計算(5)    ' ←F8でこの行に来たとき、F8なら関数の中へ/Shift+F8なら入らない
    MsgBox 結果
End Sub

Function 二乗を計算(n As Long) As Long
    二乗を計算 = n * n      ' 呼び出し先の中身
End Function

上の例で、結果 = 二乗を計算(5) の行で F8(ステップイン)を押すと 二乗を計算 関数の中に入ります。Shift + F8(ステップオーバー)を押すと、関数の中身を一気に実行して MsgBox の行に進みます。

ステップ実行とブレークポイントの組み合わせ方

ステップ実行とブレークポイントは、セットで使うと真価を発揮します。基本の流れは、「ブレークポイントで怪しい場所まで一気に進み、そこからステップ実行で細かく追う」というものです。

たとえば、500行のデータを処理するマクロで、300行目あたりから結果がずれているとします。最初の1行目からF8で追っていたら、300回もF8を押さなければなりません。これは現実的ではないですよね。

そこで、怪しい処理の手前にブレークポイントを置き、F5(実行/継続)で一気にそこまで進めます。到達したらF8に切り替えて、1行ずつ慎重に追っていきます。「ざっくり飛ばして、肝心な部分だけ細かく見る」という緩急が、効率的なデバッグのコツですよ。

なお、調査の途中でもう最後まで実行してよいと判断したら、F5 を押せばブレークモードから通常実行に戻ります。止めて、追って、再開して、という操作をテンポよく切り替えてみてくださいね。

変数の中身を確認する3つのウィンドウ

処理を止めたり1行ずつ追ったりできるようになったら、次は「変数の中身をどう見るか」です。VBEには変数を確認するためのウィンドウが3つあり、それぞれ得意分野が違います。

どのウィンドウもメニューの「表示」から開けます。VBEの画面構成そのものに不安がある方は、VBEの画面の見方を図解で解説した記事で各ウィンドウの位置を先に確認しておくと、この先の説明が頭に入りやすいですよ。

ローカルウィンドウ|全変数を一覧で確認

ローカルウィンドウは、現在実行中のプロシージャ内のすべての変数とその値を、一覧で表示してくれるウィンドウです。「表示」→「ローカルウィンドウ」で開けます。

最大の強みは、何も設定しなくても全変数がまとめて見える点です。ブレークモードで開いておけば、ステップ実行で1行進むたびに、各変数の値が自動で更新されます。「どの変数がいつ変わったか」を俯瞰するのにうってつけです。

別のプロシージャに処理が移ると、表示内容も自動でそのプロシージャの変数に切り替わります。配列やオブジェクト変数は左の「+」を展開すると、中身を階層で確認できます。

「とりあえず変数の状況を把握したい」ときは、まずローカルウィンドウを開く。これが基本の動きになります。より詳しい使い方はローカルウィンドウの解説記事にまとめているので、あわせて読んでみてくださいね。

ウォッチウィンドウ|条件付き中断で特定変数を監視

ウォッチウィンドウは、「特定の変数や式」を狙い撃ちで監視するためのウィンドウです。ローカルウィンドウが全部を見せるのに対し、こちらは見たいものだけを登録して追えます。

式を登録するには、コードウィンドウで式を選択してウォッチウィンドウにドラッグするか、メニューの「デバッグ」→「ウォッチ式の追加」ダイアログを使います。登録した式は、ブレークモードに入るたびに最新の値へ更新されます。

ウォッチウィンドウの強力なところは、「ウォッチの種類」を3つから選べる点です。

  1. ウォッチ式: 値を表示するだけのタイプです。指定した変数や式の現在値を見たいときに使います。
  2. 値がTrueのときに中断: 式の結果がTrue(またはゼロ以外)になった瞬間に、自動でブレークモードに入ります。たとえば i > 100 を登録すれば、iが100を超えた瞬間に止まります(文字列の式には指定できません)。
  3. 値が変化したときに中断: 監視している式の値が変わった瞬間に止まります。「この変数が書き換わるのはどこだ」を探すのに最適です。

論理エラーで「特定の値になった瞬間を捕まえたい」ときは、この条件付き中断が圧倒的に速いです。1行ずつF8で追わなくても、条件が成立した瞬間だけVBAが止めてくれます。

1つ注意点があります。ウォッチ式の監視範囲(コンテキスト)には「すべてのプロシージャ」「すべてのモジュール」も選べます。ただし範囲を広げると、全ステートメントの後で式が評価されるため、実行速度が大きく落ちます。なるべく特定のプロシージャを指定するのがコツです。3種類のウォッチの詳しい使い分けはウォッチウィンドウの解説記事で掘り下げているので、条件付き中断を本格的に使いたい方は読んでみてくださいね。

イミディエイトウィンドウ|Debug.Printでその場確認

イミディエイトウィンドウは、その場でコードや式を実行したり、値を出力したりできる対話型のウィンドウです。「表示」→「イミディエイトウィンドウ」で開きます。

使い方の中心は Debug.Print です。コードの中にこの命令を書いておくと、指定した内容がイミディエイトウィンドウに出力されます。MsgBox と違ってダイアログが出ないので、ループ内で何度呼んでも実行が止まりません。

Sub DebugPrintの例()
    Dim i As Long
    Dim 合計 As Long

    For i = 1 To 5
        合計 = 合計 + i
        Debug.Print "i=" & i & " / 合計=" & 合計  'イミディエイトウィンドウに出力
    Next i
End Sub

このコードを実行すると、イミディエイトウィンドウに5行分のログが並びます。ループの各回でどう値が変化したかを、後からまとめて読み返せるのが利点です。MsgBoxのように毎回OKを押す必要もありません。

さらに、ブレークモードで止まっているときは、ウィンドウに直接 ? 変数名 と打ち込めば、その変数の現在値をその場で表示できます。Debug オブジェクトにはもう1つ Debug.Assert があり、条件式がFalseのときだけ自動でブレークさせる、という使い方もできます。

ログを残して後から追うならイミディエイトウィンドウ、というのが基本の役割です。Debug.Print の活用法はイミディエイトウィンドウの解説記事でさらに詳しく紹介していますよ。

デバッグツール使い分け早見表

ここまで紹介してきたツールを、1つの表にまとめました。「いつ使う」「何がわかる」「ショートカット」の3つの軸で並べています。迷ったときの早見表として使ってくださいね。

ツールいつ使う何がわかる/何ができるショートカット
ブレークポイント怪しい場所で実行を止めたいとき指定行で停止し、その時点の状態を確認できるF9(設定/解除)
ブレークポイント全解除設定が散らかったときすべての停止点をまとめて消せるCtrl+Shift+F9
ステップイン1行ずつ細かく追いたいとき呼び出し先の中にも入って実行するF8
ステップオーバー呼び出し先を信頼して飛ばすときサブプロシージャを1単位として実行Shift+F8
ステップアウト入った関数から早く抜けたいとき今の関数を一気に終え呼び出し元へ戻るCtrl+Shift+F8
カーソル行まで実行途中まで一気に進めたいときカーソル位置まで実行して停止Ctrl+F8
実行/継続ブレークモードから再開するとき次の停止点または最後まで実行F5
手動中断無限ループを止めたいとき実行中のマクロをブレークモードへCtrl+Break
ローカルウィンドウ全変数をまとめて見たいとき現在のプロシージャの全変数と値を一覧(表示メニュー)
ウォッチウィンドウ特定の変数を監視・条件で止めたいとき指定式の値表示と条件付き自動中断(表示メニュー)
イミディエイトウィンドウログ出力・その場で値を確認したいときDebug.Printの出力と式の即時実行(表示メニュー)

ざっくりした覚え方としては、止めるのがブレークポイントとCtrl+Break、進めるのがF8系とF5、見るのが3つのウィンドウ、という3グループです。この3つの役割で頭の中を整理しておくと、実際の調査でも手が動きやすくなりますよ。

実践シナリオ|論理エラーを追う手順(合計行スキップ問題)

ここからは、実際の論理エラーをデバッグツールで追ってみましょう。題材は実務でも頻出する「合計が合わない」問題です。A1からA10に数値が入っていて、その合計を求めるマクロを想定します。

Sub 合計を計算する()
    Dim i As Long
    Dim 合計 As Long
    合計 = 0

    For i = 2 To 10           ' ←本当は 1 To 10 にすべきところを 2 から始めてしまった
        合計 = 合計 + Cells(i, 1).Value
    Next i

    Range("C1").Value = 合計
End Sub

このマクロ、エラーは一切出ません。ところが、A1の値が合計に含まれず、結果が1行分だけ少なくなります。ぱっと見ではコードも自然なので、原因に気づきにくい典型的な論理エラーです。これをデバッグツールで追っていきます。

Step1:ブレークポイントでループ前に止める

まず、ループが始まる手前に止めます。合計 = 0 の行か、For の行にカーソルを置いて F9 を押し、ブレークポイントを設定します。

ブレークポイントを置いたら、F5 でマクロを実行します。すると、設定した行の直前で処理が止まり、ブレークモードに入ります。これでループに入る前の状態を、落ち着いて観察できる準備が整いました。

論理エラーは「処理が進むにつれて値がずれていく」ことが多いので、ずれる前のスタート地点から見るのが鉄則です。いきなり結果を見ても原因はわからないので、手前で止めるところから始めてくださいね。

Step2:F8ステップ実行で処理を1行ずつ追う

止まったら、F8(ステップイン)に切り替えて1行ずつ進めます。For i = 2 To 10 の行を実行した瞬間に、変数 i に初期値が入ります。ここが今回の調査の山場です。

F8でループの中に入ると、合計 = 合計 + Cells(i, 1).Value が実行されます。ここで Cells(i, 1) がどのセルを指しているかを意識しながら進めます。1回目のループで参照しているのはA1なのか、それともA2なのか。これを次のステップで確認します。

ステップ実行のいいところは、頭の中の「こう動くはず」と、実際の動きを照らし合わせられる点です。思い込みと現実のズレが見えた瞬間が、バグ発見の瞬間ですよ。

Step3:ローカルウィンドウでカウンタ変数を確認

ステップ実行と並行して、ローカルウィンドウを開いておきます。「表示」→「ローカルウィンドウ」で表示できます。ここに変数 i合計 の現在値が出ています。

For の行を実行した直後にローカルウィンドウを見ると、i の値が 2 になっているはずです。ここで「あれ、1回目なのに i が 2 から始まっている」と気づけます。本来1行目(A1)から足したいのに、ループが2行目から始まっているわけです。

さらにF8を進めて、合計 がどう増えていくかも追えます。最終的に合計がA2からA10までの和になっており、A1の分だけ足りていないことが確認できます。これで「ループの開始位置が原因だ」とはっきりしました。

変数の一覧をリアルタイムで見られるのがローカルウィンドウの強みです。i が想定と違う値だったこの瞬間こそ、デバッグの当たりですよ。

Step4:問題箇所の特定と修正

原因が特定できたら、修正は簡単です。ループの開始値を 2 から 1 に直すだけです。

Sub 合計を計算する()
    Dim i As Long
    Dim 合計 As Long
    合計 = 0

    For i = 1 To 10           ' 開始値を 1 に修正してA1から合計する
        合計 = 合計 + Cells(i, 1).Value
    Next i

    Range("C1").Value = 合計
End Sub

修正したら、ブレークポイントを F9 で解除(または Ctrl + Shift + F9 で全解除)して、もう一度実行します。今度はA1からA10まで正しく合計され、結果が合うはずです。

この一連の流れ、ポイントは「ブレークポイントで止める→F8で追う→ローカルウィンドウで変数を見る」の3点セットです。論理エラーは原因が見えにくいですが、この手順なら確実に「おかしくなる瞬間」を捕まえられます。最初は時間がかかっても、慣れれば数分で終わるようになりますよ。

なお、今回はループの開始位置という単純なミスでしたが、もっと複雑なケースで「特定の値になった瞬間に止めたい」ときは、Step2のF8連打の代わりにウォッチウィンドウの条件付き中断を使うと一気に楽になります。あわせて覚えておいてくださいね。

まとめ|デバッグを習慣にして「動かない」を素早く解決しよう

VBAのデバッグツールについて、ブレークポイントとステップ実行を軸に、3つのウィンドウの使い分けまで解説してきました。最後に要点を振り返っておきます。

  • 症状でアプローチが決まる: エラーで止まるなら止まった場所を見る、結果がおかしいならブレークポイントで自分から止めて追う。
  • 止める・進める・見るの3グループ: 止めるのがブレークポイント(F9)とCtrl+Break、進めるのがF8系とF5、見るのが3ウィンドウ。
  • 論理エラーは3点セットで追う: ブレークポイントで止め、F8で1行ずつ進め、ローカルウィンドウで変数を確認する。

このやり方が身につけば、これまで MsgBox を仕込んで消してを繰り返していた時間が、まるごと節約できます。「動かない」に出くわしたとき、慌てずに原因を特定できるようになりますよ。

各ツールの詳細は専門記事へ

この記事は、デバッグツール全体の地図のような位置づけです。それぞれのツールには、ここで触れきれなかった便利な機能がまだあります。深く使いこなしたいときは、次の専門記事も読んでみてくださいね。

また、実行時エラーで止まったときはVBAマクロのエラー解決ガイドでエラー番号別の直し方を確認できます。そもそもエラーで止まらないようにコードを設計したい場合は、VBAのエラーハンドリング完全ガイドOn Error 構文の使い分けを学べますよ。

デバッグは、最初こそ面倒に感じるかもしれません。ですが一度フローが身につくと、「動かない」が「すぐ直せる」に変わります。今日紹介した手順を、次にマクロが動かなかったときにぜひ試してみてくださいね。

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