6.

VBAデバッグの方法|F8ステップ実行・ブレークポイント・変数監視

編集
この記事の要点
  • VBE(Visual Basic Editor)でブレークポイントを設定し、F8 キーで 1 行ずつ実行できる
  • F8 がステップイン、Shift+F8 がステップオーバー、Ctrl+Shift+F8 がステップアウト
  • ブレークポイント設定は F9、コード左の縦帯クリックでも切替可能
  • 実行中の変数値はローカルウィンドウウォッチウィンドウで確認、印字はイミディエイトウィンドウDebug.Print が便利
  • 条件付きで停止したいときは If 条件 Then Stop またはウォッチの「True になったら中断」を使う

VBA デバッグの基本

VBA(Excel / Word / Access などのマクロ)のバグは、コードを 1 行ずつ追いかけて変数値の変化を観察するのが最短ルートです。VBE(Visual Basic Editor、Alt+F11 で起動)には、ブレークポイントとステップ実行という強力な機能が標準装備されています。

ステップ実行のショートカット一覧

キー動作用途
F8ステップイン1 行ずつ実行。Call Sub2 なら Sub2 の中まで入っていく
Shift+F8ステップオーバー1 行ずつ実行。呼び出した Sub / Function は中に入らず一気に通過
Ctrl+Shift+F8ステップアウト今いる Sub / Function を最後まで実行して呼び出し元に戻る
F5続行次のブレークポイントまで通常実行
F9ブレークポイント切替カーソル行に赤丸(停止点)を付与 / 解除
Ctrl+Shift+F9全ブレークポイント解除赤丸を一気にクリア
Ctrl+Break実行中断無限ループから抜ける

典型的な手順

1. ブレークポイントを置く

VBE で停止させたい行にカーソルを置き、F9 を押すか、左側の灰色帯をクリックします。赤丸が付いた行で実行が一時停止します。

2. マクロを実行する

Excel 側から通常通りマクロを実行するか、VBE 上で F5 を押します。ブレークポイントに達するとその行が黄色く反転し、まだ実行されていない状態で停止します。

3. F8 で 1 行ずつ進める

F8 を押すたびに次の 1 行が実行されます。For ループの中なら同じ行を繰り返し通過するので、ループの 1 周ごとに変数がどう変わるかを目視確認できます。

サンプルコードで動きを見る

Sub StepDemo()
    Dim i As Long
    Dim total As Long
    total = 0

    For i = 1 To 5
        total = total + i        ' ← ここに F9 でブレークポイント
    Next i

    Debug.Print "合計 = " & total
End Sub

ブレークポイントで停止したら、F8 を押すたびに total = total + i が 1 周ずつ実行されます。itotal がどう増えていくかをローカルウィンドウで確認します。

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

ウィンドウ開き方役割
ローカルウィンドウ表示 → ローカルウィンドウ現在のスコープのすべての変数を自動表示。配列や Object の中身も展開可能
ウォッチウィンドウ表示 → ウォッチウィンドウ変数を選択して右クリック →「ウォッチ式の追加」。条件式で停止させることも可能
イミディエイトウィンドウCtrl+G?Debug.Print で値を出力。停止中に ?i と打てば i の値が出る

条件付きで停止させたい

i が 100 のときだけ止めたい」のような条件付きブレークは、コード内に If 〜 Then Stop を書くのが手っ取り早い方法です。

For i = 1 To 1000
    If i = 100 Then Stop        ' i=100 のときだけブレーク
    ' ── ここで F8 で続きを追える ──
Next i

恒久的に残したくないので、デバッグが終わったら Stop 行は必ず削除してください。

F8 と Shift+F8 の使い分け

関数呼び出し(Call Sub2x = MyFunc())を含む行で F8 を押すと、その関数の中まで入っていきます。標準ライブラリや既にバグの無いことが分かっている自作 Sub に毎回入りたくない場合は、Shift+F8(ステップオーバー)で一気に飛ばすと効率的です。

カーソル位置まで実行

長いマクロの途中から細かく追いたいときは、確認したい行にカーソルを置いて Ctrl+F8 を押すと、そこまで通常実行で一気に進み、その行で停止します。

よくあるトラブル

症状対処
F8 を押しても進まないVBE がアクティブになっていない。VBE のコードウィンドウをクリックしてからもう一度 F8
無限ループから抜けられないCtrl+Break または Esc 連打
ブレークポイントが灰色になり機能しないマクロが「設計時」状態にリセットされた可能性。保存して開き直すか、コードを 1 文字書き換えて元に戻す
変数値が一覧に出ない表示 → ローカルウィンドウを開いていないだけ。または変数が他モジュールのスコープ

Debug.Print でログ出力する

ステップ実行と並んで強力なのが Debug.Print です。マクロ実行中の任意の場所で値をイミディエイトウィンドウに出力でき、後から処理の流れを追えます。

Sub LogDemo()
    Dim i As Long
    For i = 1 To 5
        Debug.Print "i=" & i & " 時刻=" & Now
    Next i
End Sub

Ctrl+G でイミディエイトウィンドウを開いておけば、実行後に履歴が一覧表示されます。MsgBox はモーダルで処理を止めるため、ループ内の確認には向きません。ループ内のデバッグは Debug.Printが鉄則です。

エラー発生時に自動でブレーク

「実行時エラー '9': インデックスが有効範囲にありません」のようなエラーが出た瞬間に停止させたい場合は、VBE のメニュー ツール → オプション → 全般タブ → エラートラップ「エラー発生時に中断」に設定します。On Error Resume Next でエラーを握りつぶしていた箇所でも、強制的に停止してくれるため原因究明が早くなります。

呼び出し履歴(Call Stack)

停止中に Ctrl+L を押すと 呼び出し履歴ウィンドウが開き、「Sub A → Sub B → Sub C」のように現在の呼び出しチェーンが見えます。深い呼び出しでバグが起きたとき、どこから呼ばれてきたかを一瞬で把握できます。

関連

  • VBA — 親カテゴリ
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. マクロとボタンの紐づけ方法
  2. 開発タブの表示
  3. モジュールの名前変更方法
  4. エラー一覧
  5. シートのコピー
  6. デバッグで一行ずつ実行する方法
  7. 変数宣言時のSETありなしの違い
  8. if文で複数条件を指定する方法

最近更新/作成されたページ