VBEの使い方:デバッグ
VBE(Visual Basic Editor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。
目次
実行、中断、リセット(停止)
![VBA VBE デバッグ](image254.jpg)
アイコンまたはショートカットを使ったほうが良いでしょう。
実行
![VBA VBE デバッグ](image253.jpg)
中断
![VBA VBE デバッグ](image255.jpg)
VBA実行中はアイコンがクリックできない状態の場合が多いので、ショートカットを使ったほうが良いでしょう。
ショートカットCtrl+Breakは、「Esc」キーで代替えできます。
![VBA VBE デバッグ](image257.jpg)
![VBA VBE デバッグ](image258.jpg)
VBAが高速に動作している途中では、「Esc」キーで簡単に中断できない場合があります。
そのような場合は、まずは「Esc」キーを複数回連打してください。
それでも中断しない場合は、タスクバーのエクセルとVBEを切り替えながら、Escを連打してみてください。
詳しくは以下のブログに書かれています。
なにより、
VBA実行前には必ずエクセルを保存しておきましょう。
リセット(停止)
モジュールレベル変数はリセットされます。
![VBA VBE デバッグ](image256.jpg)
ショートカットは無いので、キーボード操作ではEsc中断後に「終了」を選んでください。
ステップ実行
良くあることです、と言いますか、書いたマクロVBAが一発で全て正しく動作することの方が少ないと言って良いでしょう。
しかし、VBAコードをいくら眺めていても原因が分からない・・・これは普通に良くあることです。
このような場合は、VBAをステップ実行して原因を突き止めましょう。
ステップイン
![VBA VBE デバッグ](image259.jpg)
![VBA VBE デバッグ](sample_gif13.gif)
※動きを見るために処理は意味のない単純なコードにしています。
ステップオーバー
ステップインとは違い、プロシージャの中に入ることなく、プロシージャ呼び出しをステップ実行します。
![VBA VBE デバッグ](image260.jpg)
当該プロシージャーを1ステップずつ進みます。
![VBA VBE デバッグ](sample_gif23.gif)
※動きを見るために処理は意味のない単純なコードにしています。
ステップオーバーすることでステップインに比べて時間短縮ができます。
ステップアウト
ステップイン実行中または中断している時に、
![VBA VBE デバッグ](image261.jpg)
カーソル行の前まで実行
![VBA VBE デバッグ](image262.jpg)
例えば大きなループのようなVBAコードを一気に飛ばしてその先へ進むことができます。
これは、
停止するステートメントにブレークポイントを設定し実行F5したことと同じことになります。
ブレークポイント
実行を停止する必要がなくなった場合は、ブレークポイントを解除します。
ブレークポイントを設定または解除する行に入力カーソルを置き、
![VBA VBE デバッグ](image263.jpg)
または、インジケーターをクリックします。
![VBA VBE デバッグ](sample_gif41.gif)
![VBA VBE デバッグ](image264.jpg)
呼び出し履歴
![VBA VBE デバッグ](image265.jpg)
![VBA VBE デバッグ](image266.jpg)
プロシージャから別のプロシージャを呼び出すと、呼び出されたプロシージャも一覧に追加されます。
呼び出されたプロシージャは、実行が呼び出し元のプロシージャに戻ったときに一覧から削除されます。
![VBA VBE デバッグ](image267.jpg)
最初に起動したプロシージャーから現在のプロシージャーまでの呼び出し履歴が表示されている事になります。
![VBA VBE デバッグ](sample_gif6.gif)
ローカルウィンドウの内容は、移動した先のプロシージャーの変数に変わります。
再度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
![VBA VBE デバッグ](image247.jpg)
![VBA VBE デバッグ](image272.jpg)
イミディエイトウィンドウで、
![VBA VBE デバッグ](image273.jpg)
しかし、そもそも変数i,jは?、引数arg1,arg2は?
これらをまとめてみたい時は、ローカルウィンドウが便利です。
![VBA VBE デバッグ](image274.jpg)
しかし、そもそも呼び出し元の「sample_sub1」の変数はどうなっているの?
これはローカルウィンドウで見ることができません。
呼び出し履歴とローカルウィンドウで変数の内容を確認
![VBA VBE デバッグ](image275.jpg)
「呼び出し履歴」でどこからよびだされたかは必ず確認しましょう。
![VBA VBE デバッグ](image276.jpg)
ただし、
「sample_sub2」の変数表示が消えてしまい、両方を同時に確認することはできないのが少々不便です。
マウスポインターを置いて変数の内容を確認
![VBA VBE デバッグ](sample_gif7.gif)
しかし、カーソルを移動すると表示は消えていますますので、
多くの変数を確認したり、比較したりという用途には向きません。
ウォッチウインドウで変数の内容を確認
操作したプロシージャーの変数として追加されます。
![VBA VBE デバッグ](sample_gif8.gif)
「対象」をみることで、どのプロシージャーの変数かを確認することができます。
![VBA VBE デバッグ](image279.jpg)
![VBA VBE デバッグ](image280.jpg)
条件を判定する位置を指定できないので、少々使いづらいかもしれません。
この例では、
「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
![VBA VBE デバッグ](image277.jpg)
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
![VBA VBE デバッグ](image281.jpg)
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 VBE デバッグ](image282.jpg)
デバッグの最後に
動作テストと動作不具合のデバッグに費やされる時間の方が長いというのは良くあることですし、むしろ普通の事です。
従って、このデバッグ時間は、VBA開発の総時間に大きく影響します。
同じテーマ「マクロVBA入門」の記事
VBEの使い方:VBE画面の全体説明
VBEの使い方:ツールのオプション設定
VBEの使い方:ツールバー
VBEの使い方:右クリックメニューとヘルプ
VBEの使い方:ショートカットキーとコード編集
VBEの使い方:イミディエイト ウィンドウ
VBEの使い方:ローカル ウィンドウ
VBEの使い方:ウォッチ ウィンドウ
VBEの使い方:オブジェクト ブラウザー
VBEの使い方:デバッグ
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。