🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA のブレークポイント — マクロを凍結して 1 行ずつ実行する

|

Excel VBA のブレークポイント — マクロを凍結して 1 行ずつ実行する

TL;DR — ブレークポイントは、行が実行される にその行でマクロを一時停止し、break mode(中断モード) に入れてくれます。そこではあらゆる生きた値を読めます — 変数にマウスを重ねて data tip を見る、あるいは イミディエイトウィンドウ に尋ねる — そのうえでコードを 1 行ずつ歩けます。 F9 でブレークポイントを設定/解除、F5 でそこまで実行、F8 で次の行へステップ、Shift+F8 で呼び出した プロシージャをステップオーバー。これは 何の 値だったかではなく、どの行 で間違うのかを見つけるやり方です。 知っておくべきことが 2 つ。ブレークポイントはファイルに 保存されません。そして出荷したコードの中の Stop 文は、ユーザーの Excel を凍りつかせます。

Sub Investigate()
    Dim total As Double, r As Long
    For r = 2 To 100
        total = total + Cells(r, 3).Value   ' ここで F9 を押すと breakpoint(赤い点)が付く
    Next r                                   ' F8 でステップ;total にマウスを重ねて増えていく様子を見る
    Debug.Assert total > 0                   ' これが False のときだけエディタで中断する
End Sub

この記事で学べること

  • 考え方の軸 — ブレークポイントは時間を凍結し、コードを歩けるようにする
  • 力の順に並んだ 3 つの観測手段と、なぜこれが重量級なのか
  • F9 でのブレークポイントの設定と、F8 対 Shift+F8 のステップ
  • ブレークポイントが消える理由と、Stop を絶対に出荷してはいけない理由
  • Debug.Assert が本番でも安全なブレークポイントになる仕組み
  • ステップ実行すべきとき、そして代わりに Debug.Print を撒くべきとき

考え方の軸:時間を凍結し、それからコードを歩く

ブレークポイントは、選んだ行 がまだ実行される前に 実行を止め、飛行中に凍結したマクロを手渡してきます。 すべての変数は生きた値を保持し、コールスタックは無傷で、Excel はあなたのロジックがいる場所でちょうど一時停止 しています。そこから ステップ します。F8 は現在の行を実行して次の行で止まるので、あなたはプログラムを 人間の速さで前へ歩き、各文が効いていく様子を見られます。

そこが決定的な違いです。Debug.Print は、実行後に値が 何だった かを教えます。 ブレークポイントは、ふるまいが期待から最初に食い違う どの行 かを見つけさせます。値は間違っているのに、 どこで間違ったのか言えないとき、必要なのはもっと多くのログではありません — マクロを凍結し、それが起きるのを 見ることです。

力の順に並んだ 3 つの観測手段

ブレークポイントは、はしごのてっぺんの段です。マクロがおかしなふるまいをするとき、各道具は別々の問いに答え、 これは時間を止めるものです。

観測手段 答える問い 決まってつく嘘
Debug.Print 実行中、値は何だったか? 既定で閉じているウィンドウに出力する
Immediate Window いま、この一時停止の瞬間に何が真か? ? の問い合わせは実はコードを 実行する
Breakpoint + F8 どの行で間違うのか? ブックを閉じると消える

Debug.Print は過去を見せ、イミディエイトウィンドウ は現在を問いただし、 ブレークポイントは現在を 作り出し、マクロを凍結して調べさせ、ステップさせます。3 つの中で最も強力で、最も 使うのが遅い — 10,000 回のループを手でステップするのは誰にとっても午後の過ごし方ではありません — だから、 より安上がりな観測手段が「どの行?」に答えられないときに、まさにこれへ手を伸ばします。

ブレークポイントの設定と、F8 対 Shift+F8

行の左の灰色の余白をクリックするか、行にカーソルを置いて F9 を押すと breakpoint が設定されます — 赤い点が 印になり、次の実行はそこで一時停止します。いったん止まれば、4 つのキーが歩みを進めます。

  • F8(Step Into) — この行を実行する。もし Sub や Function を 呼ぶ なら、その中へ入って 1 行ずつ続ける。
  • Shift+F8(Step Over) — 呼び出したプロシージャを丸ごと実行し、ここの次の行で止まる。
  • Ctrl+Shift+F8(Step Out) — 現在のプロシージャを終わらせ、それが呼ばれた場所で止まる。
  • F5(Run) — ステップをやめ、次のブレークポイントか終わりまで実行する。

第 1 位の時間の浪費は、すでに信頼している 500 行のヘルパー — 整形ルーチン、ライブラリ呼び出し — の 中へ まっすぐ F8 で入り込み、その全部をステップすることです。バグを書いたのがあなたでないなら、Shift+F8 で ステップオーバー しましょう。F8 は疑っているコードのため、Shift+F8 は疑っていないコードのためです。

罠 1:ブレークポイントは保存されない — そして Stop こそが保存される罠

ブックを閉じると、すべてのブレークポイントは消えます。エディタのセッションの中に生きていて、ファイルの中には いないので、マクロと一緒に旅することも、他人に発火することもありません。たいていはそれが望みどおりです。

誘惑に駆られる対処が Stop 文 — コードに書き込まれた 恒久的な ブレークポイントです。

Sub Risky()
    Stop                     ' 毎回ここで一時停止する — ユーザーのマシンでも
    ' ... 本来の処理 ...
End Sub

Stop は、再起動を生き延びるので開発中は本当に便利です。しかし本番に届くと、ユーザー がマクロを走らせ、 Stop に当たり、Excel は、そのユーザーが理解できず VBA エディタなしには解除もできない中断で、凍りついたように 見えます。Stop は、出荷前に必ず削除する開発専用の目印として扱いましょう — エラー処理として使ってはならず、 あなたのマシンを離れるコードには決して入れてはいけません。

罠 2:Debug.Assert は出荷して安全なブレークポイント

条件 をチェックし、本番では無害なブレークポイントが欲しいときは、Debug.Assert を使います。

Debug.Assert cnt = expected      ' 件数が食い違えばエディタで中断する
Debug.Assert Not rng Is Nothing  ' range が解決できなければ中断する

Debug.Assert condition は、条件が False のとき だけ、しかも VBA エディタの 中でだけ 実行を中断します — 実行時、IDE の外では、この行は完全に無視されます。だからこれは、常に成り立つべきだと信じる不変条件(「後の 件数は前の件数と等しい」「このオブジェクトは Nothing ではない」)を書き込む正しいやり方になります。開発中は 前提が崩れた瞬間にあなたを止め、ユーザーの手元では何のコストもかからず、誰も凍らせません。自らを説明する、 条件付きのブレークポイントです。

罠 3:一時停止中の編集は状態を捨てる

break mode ではコードを編集できます — そして VBA はしばしば、変更を反映するために実行を リセット し、生きた 変数をすべて空へ戻し、最初からやり直します。これが、ステップの途中で変数が「消えた」と報告される通常の原因です。 小さな編集が、こっそりマクロを再スタートさせたのです。一時停止した実行の奥深くにいるなら、いま見つけたタイプ ミスを直したい衝動は、止めたかった状態を読み終えるまで我慢しましょう。関連する強力な道具:Set Next Statement (Ctrl+F9)は黄色い矢印をドラッグして行を再実行したり飛ばしたりできます — ステップをやり直すのに極めて有用ですが、 初期化を飛ばすと、そのあと調べる状態は嘘になります。

ブレークポイントと Debug.Print

両者はライバルではなく、同じ狩りの別々の局面です。

Breakpoint + F8 Debug.Print
答えるもの どの行 で間違うか 何の 値だったか
大きなループ つらい — 毎回ステップする 理想的 — 何千行も流れ去る
対話的 はい — 生きた状態を調べ、書き換える いいえ — 出力するだけ
コスト マクロを止める 全速力で走る

Debug.Print で 10,000 行のループを数字が崩れる領域まで絞り込み、それから そこ にブレークポイントを置きます — あるいは、値が初めて負に転じたときだけ止まる 中断条件付きの Add Watch を使い、全部を F8 で通す代わりに、問題のただ 1 回の 繰り返しで凍結します。ログが近所を見つけ、ブレークポイントが行を見つけます。

意見:重い道具は、狙って使う

ブレークポイントは VBA が与える最強のデバッガであり、最も扱うのが遅い道具でもあります。だから、より安上がりな 道具が尽きる場所で使いましょう。値が間違っていて、どの文が原因なのか本当に言えないときに。値から答えられること — この変数は期待どおりか、このループは正しい回数走るか — のすべてには、Debug.Printイミディエイトウィンドウ の問い合わせのほうが速く、世界を止めません。

素早くデバッグする人と、エディタと格闘する人を分ける規律が 2 つあります。Stop を決して出荷しないこと。 常に真であるべき前提は代わりに Debug.Assert で書き、開発では守り本番では消えるようにすること。そして、自分が 書いていないコードを F8 で通さないこと — ステップオーバーしましょう。目的はすべての行を見ることではありません。 あなたに嘘をつくただ 1 行に到達することです。

仕事そのものが壊れた行探しのとき — それを説明する

ステップ実行は、1 回の壊れた実行には見事ですが、「8,000 行のどれが合計を壊すか」にはみじめです。ブレークポイントを 置き、ウォッチを足し、値が狂うまでステップし終える頃には、問い合わせなら 1 回で答えることを手作業でシミュレート していたことになります。 ExcelMaster なら、その問いを普通の言葉で — 「累計が E 列と合わなくなる最初の行を見つけて、その前後の行を見せて」 — と言うだけです。そして、シートを読み、 まずファイルをバックアップし、すべての行をチェックし、その犯人そのものを返す Python を生成します。1 つの 失敗を理解するにはブレークポイントを、どの ケースが失敗するかを見つけるのが仕事ならルールを説明しましょう。

よくある質問

VBA でブレークポイントを設定するには?

行の左の灰色の余白をクリックするか、行にカーソルを置いて F9 を押します。赤い点がその行の印になり、次にマクロが 走るときちょうどその行の前で一時停止して、break mode に入れてくれます。もう一度その行で F9 を押すと breakpoint が 削除されます。

ブレークポイントが消え続けるのはなぜですか?

ブレークポイントはブックと一緒には保存されないからです — ファイルを閉じるとすべて消えます。コードの中に生きる 一時停止が必要なら Stop 文を使えますが、マクロを共有する前に削除しましょう。Stop は、走らせた誰の Excel も 凍りつかせるからです。

F8 と Shift+F8 の違いは何ですか?

F8(Step Into) は 1 行を実行し、それが呼ぶ Sub や Function の中へ入るので、呼ばれたコードの中も歩きます。 Shift+F8(Step Over) は呼び出したプロシージャを丸ごと実行し、現在の行の次で止まります。すでに信頼している ヘルパールーチンには Step Over を使いましょう。

マクロが一時停止している間に変数の値を見るには?

変数名にマウスポインタを重ねて data tip を見るか、イミディエイトウィンドウ? varName と打つか、変数を Watch Window に追加します。これらが効くのは、マクロが break mode で一時停止して いる間だけです。ローカル変数は実行中にしか存在しないからです。

VBA の Debug.Assert は何をしますか?

Debug.Assert condition は、条件が False のときだけ VBA エディタで実行を中断し、エディタの外でコードが走る ときは完全に無視されます。開発中に不変条件 — 件数が一致する、オブジェクトが Nothing でない — をチェックする 安全なやり方で、ユーザーの Excel を凍らせかねない Stop を残さずに済みます。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-05.

関連ガイド: VBA Debug.Print · VBA Immediate Window · VBA Error Handling · VBA On Error · VBA For ループ