VBEの使い方:デバッグ
VBE(Visual Basic Editor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。
目次
実行、中断、リセット(停止)

アイコンまたはショートカットを使ったほうが良いでしょう。
実行

中断

VBA実行中はアイコンがクリックできない状態の場合が多いので、ショートカットを使ったほうが良いでしょう。
ショートカットCtrl+Breakは、「Esc」キーで代替えできます。

VBAが高速に動作している途中では、「Esc」キーで簡単に中断できない場合があります。
そのような場合は、まずは「Esc」キーを複数回連打してください。
それでも中断しない場合は、タスクバーのエクセルとVBEを切り替えながら、Escを連打してみてください。
詳しくは以下のブログに書かれています。
なにより、
VBA実行前には必ずエクセルを保存しておきましょう。
リセット(停止)
モジュールレベル変数はリセットされます。

ショートカットは無いので、キーボード操作ではEsc中断後に「終了」を選んでください。
ステップ実行
良くあることです、と言いますか、書いたマクロVBAが一発で全て正しく動作することの方が少ないと言って良いでしょう。
しかし、VBAコードをいくら眺めていても原因が分からない・・・これは普通に良くあることです。
このような場合は、VBAをステップ実行して原因を突き止めましょう。
ステップイン


※動きを見るために処理は意味のない単純なコードにしています。
ステップオーバー
ステップインとは違い、プロシージャの中に入ることなく、プロシージャ呼び出しをステップ実行します。

当該プロシージャーを1ステップずつ進みます。

※動きを見るために処理は意味のない単純なコードにしています。
ステップオーバーすることでステップインに比べて時間短縮ができます。
ステップアウト
ステップイン実行中または中断している時に、

カーソル行の前まで実行

例えば大きなループのようなVBAコードを一気に飛ばしてその先へ進むことができます。
これは、
停止するステートメントにブレークポイントを設定し実行F5したことと同じことになります。
ブレークポイント
実行を停止する必要がなくなった場合は、ブレークポイントを解除します。
ブレークポイントを設定または解除する行に入力カーソルを置き、

または、インジケーターをクリックします。

実行ポインタの移動(任意の行へジャンプ)

特定の処理を飛ばしたい時: エラーが発生する部分や、確認の必要がない長いループなどをスキップして、デバッグを効率化できます。
コードをもう一度実行したい時: 変数の値を確認した後、その変数を変更するコード行に戻り、再度実行して挙動の変化を見ることができます。
特定の条件分岐を試したい時: 通常の実行ではなかなか到達しないような特定の条件分岐内のコードに強制的にジャンプして、その動作を確認することができます。
呼び出し履歴


プロシージャから別のプロシージャを呼び出すと、呼び出されたプロシージャも一覧に追加されます。
呼び出されたプロシージャは、実行が呼び出し元のプロシージャに戻ったときに一覧から削除されます。

最初に起動したプロシージャーから現在のプロシージャーまでの呼び出し履歴が表示されている事になります。

ローカルウィンドウの内容は、移動した先のプロシージャーの変数に変わります。
再度F8等で進めた時は、再び実行中の変数の表示に戻ります。
※呼び出し元の変数の確認方法
呼び出し元で既に間違った処理が行われている場合が多々あります。
このような場合には呼び出し履歴を活用して原因を突き止めてください。
VBA実行途中で変数の状態を確認
VBA実行途中で変数の状態を確認の概要
Sub sample()
Dim i, r2
r2 = Sqr(2) * 10 ^ 14
For i = 1 To Len(r2) - 1
Call sample_sub1(r2, i)
Next
End Sub
Sub sample_sub1(arg1, arg2)
Dim i, j
i = Mid(arg1, arg2, 1)
j = Mid(arg1, arg2 + 1, 1)
Call sample_sub2(i, j)
End Sub
Sub sample_sub2(arg1, arg2)
Dim i, j, v
i = arg1 + 1
j = arg2 - 1
v = (i + j) / (i - j)
End Sub


イミディエイトウィンドウで、

しかし、そもそも変数i,jは?、引数arg1,arg2は?
これらをまとめてみたい時は、ローカルウィンドウが便利です。

しかし、そもそも呼び出し元の「sample_sub1」の変数はどうなっているの?
これはローカルウィンドウで見ることができません。
呼び出し履歴とローカルウィンドウで変数の内容を確認

「呼び出し履歴」でどこからよびだされたかは必ず確認しましょう。

ただし、
「sample_sub2」の変数表示が消えてしまい、両方を同時に確認することはできないのが少々不便です。
マウスポインターを置いて変数の内容を確認

しかし、カーソルを移動すると表示は消えていますますので、
多くの変数を確認したり、比較したりという用途には向きません。
ウォッチウインドウで変数の内容を確認
操作したプロシージャーの変数として追加されます。

「対象」をみることで、どのプロシージャーの変数かを確認することができます。


条件を判定する位置を指定できないので、少々使いづらいかもしれません。
この例では、
「i=j」の指定では、初期値0で成立してしまうので、別の式が必要になります。
エラー原因を特定する
sampleで作成した、「141421356237310」
sample_sub1で2桁ずつ取り出し、6,7桁目「13」
sample_sub2で、+1,-1した結果が「2,2」となり、(2-2)=0
これにより0除算が行われたという事になります。
もちろん、今回のVBAは全く意味がな言事は、再度言っておきます。
Debug.Print
イミディエイトウィンドウにテキストを出力します。
メソッド実行後は、イミディエイトウインドウの内容は改行されます。
,(カンマ)に続けて書かれた変数・定数・式の値は、一定の字数間隔をあけて表示されます。
エラー停止した時点では、既に変数が書き換えられていて、原因がはっきりしない場合も多々あります。
変数の値をイミディエイトウィンドウに順次出力していくことで、その変遷を確認します。
Sub sample_sub1(arg1, arg2)
Debug.Print "sample_sub1:"; "arg1="; arg1, "arg2=";
arg2
Dim i, j
i = Mid(arg1, arg2, 1)
j = Mid(arg1, arg2 + 1, 1)
Call sample_sub2(i, j)
End Sub
Sub sample_sub2(arg1, arg2)
Debug.Print "sample_sub2:"; "arg1="; arg1, "arg2="; arg2
Dim i, j, v
i = arg1 + 1
j = arg2 - 1
v = (i + j) / (i - j)
End Sub

Debug.Assert
式がFalseとなった時にVBAが中断します。
開発環境でのみ動作します。
プロジェクトをパスワード保護した場合は、Debug.Assertは動作しません。
その条件を満たさなくなった時にVBAを中断したい場合に使います。
Sub sample_sub2(arg1, arg2)
Dim i, j, v
i = arg1 + 1
j = arg2 - 1
Debug.Assert (i - j) <> 0
v = (i + j) / (i - j)
End Sub

IFステートメント + Stopステートメントを使う事で、同様の事は可能です。
Sub sample_sub2(arg1, arg2)
Dim i, j, v
i = arg1 + 1
j = arg2 - 1
If (i - j) = 0 Then Stop
v = (i + j) / (i - j)
End Sub

デバッグの最後に
動作テストと動作不具合のデバッグに費やされる時間の方が長いというのは良くあることですし、むしろ普通の事です。
従って、このデバッグ時間は、VBA開発の総時間に大きく影響します。
同じテーマ「マクロVBA入門」の記事
VBEの使い方:VBE画面の全体説明
VBEの使い方:ツールのオプション設定
VBEの使い方:ツールバー
VBEの使い方:右クリックメニューとヘルプ
VBEの使い方:ショートカットキーとコード編集
VBEの使い方:イミディエイト ウィンドウ
VBEの使い方:ローカル ウィンドウ
VBEの使い方:ウォッチ ウィンドウ
VBEの使い方:オブジェクト ブラウザー
VBEの使い方:デバッグ
新着記事NEW ・・・新着記事一覧を見る
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
