VBA入門
VBEの使い方:デバッグ

VBAの開発環境であるVBEの基本的な使い方
公開日:2019-10-06 最終更新日:2021-10-15

VBEの使い方:デバッグ


VBE(Visual Basic Editor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。


ここではVBA開発で重要かつ避けて通れないデバッグの方法について、VBEのメニュー及びツールバーにそって説明していきます。


目次

実行、中断、リセット(停止)

VBAを実行したり、中断/終了させるための専用のメニューがあります。

VBA VBE デバッグ

ですが、メニュー操作は少々面倒なので、
アイコンまたはショートカットを使ったほうが良いでしょう。

実行

SubからEnd Subの間(どの行のどの位置でも良い)に入力カーソル(点滅カーソル)がある状態で、

VBA VBE デバッグ

このアイコンをクリックまたはショートカットF5で、カーソルのあるプロシージャーが起動されます。

中断

VBAが動いている最中に、

VBA VBE デバッグ

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

VBA VBE デバッグ

「継続」
VBAの実行が継続されます。
「終了」
VBAの実行が終了します。
「デバッグ」
中断しているVBAの「次のステートメント」(次に実行されるステートメント)が表示されます。
VBA VBE デバッグ

VBAが高速に動作している途中では、「Esc」キーで簡単に中断できない場合があります。
そのような場合は、まずは「Esc」キーを複数回連打してください。
それでも中断しない場合は、タスクバーのエクセルとVBEを切り替えながら、Escを連打してみてください。
詳しくは以下のブログに書かれています。
また、VBEが操作可能な場合は、万一のためにVBAソースをCtrl+Cでメモ帳等にコピペすることを試みてみましょう。
なにより、
VBA実行前には必ずエクセルを保存しておきましょう。

リセット(停止)

実行しているVBAを強制停止させます。
モジュールレベル変数はリセットされます。

VBA VBE デバッグ

このアイコンをクリックします。
ショートカットは無いので、キーボード操作ではEsc中断後に「終了」を選んでください。


ステップ実行

VBAを実行した結果が正しくない・・・
良くあることです、と言いますか、書いたマクロVBAが一発で全て正しく動作することの方が少ないと言って良いでしょう。

まずは結果(シートのセル等の出力結果)をよく見て、不正の原因となるVBAコードを見つける事が重要です。
しかし、VBAコードをいくら眺めていても原因が分からない・・・これは普通に良くあることです。
このような場合は、VBAをステップ実行して原因を突き止めましょう。

ステップイン

VBAコードの各行を1行ずつ実行し、 呼び出し先のプロシージャへもステップ インします。

SubからEnd Subの間(どの行のどの位置でも良い)に入力カーソル(点滅カーソル)がある状態で、

VBA VBE デバッグ

ショートカット F8 を使うと良いでしょう。

実行中のプロシージャーから呼び出している先のプロシージャーやプロパティの内部にも入ります。

VBA VBE デバッグ
※動きを見るために処理は意味のない単純なコードにしています。

ステップオーバー

各プロシージャを1つのステートメントのように実行します。
ステップインとは違い、プロシージャの中に入ることなく、プロシージャ呼び出しをステップ実行します。

ステップイン実行中または中断している時に、

VBA VBE デバッグ

ショートカット Shift+F8 を使うと良いでしょう。

実行中のプロシージャーから呼び出している先には入りません。
当該プロシージャーを1ステップずつ進みます。

VBA VBE デバッグ
※動きを見るために処理は意味のない単純なコードにしています。

呼び出し先のプロシージャーやプロパティの中に入る必要がない場合は、
ステップオーバーすることでステップインに比べて時間短縮ができます。

ステップアウト

当該プロシージャの残りのコードすべてを1つのステートメントであるかのように実行し、当該プロシージャーは終了して、最初にプロシージャを呼び出したプロシージャの次のステートメントに進みます。
ステップイン実行中または中断している時に、

VBA VBE デバッグ

ショートカット Ctrl+Shift+F8 を使うと良いでしょう。

当該プロシージャーの残り部分についてステップでの確認が必要ないときに使います。

カーソル行の前まで実行

VBAコード内で実行を停止するステートメント行を選択できます。

VBA VBE デバッグ

ショートカット Ctrl+F8 を使うと良いでしょう。

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

ブレークポイント

プロシージャ内のブレークポイントを設定したステートメントで実行を中断できます。
実行を停止する必要がなくなった場合は、ブレークポイントを解除します。
ブレークポイントを設定または解除する行に入力カーソルを置き、

VBA VBE デバッグ

ショートカットは F9 です。
または、インジケーターをクリックします。

VBA VBE デバッグ

実行F5中に、ブレークポイントで中断します。

VBA VBE デバッグ

実行F5またはステップインF8で継続できます。


呼び出し履歴

VBA中断時に、現在アクティブなプロシージャ呼び出しの一覧を表示します。

VBA VBE デバッグ

VBA VBE デバッグ

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

VBA VBE デバッグ

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

プロシージャーを選択して「表示」をクリックすると、選択したプロシージャー移動します。

VBA VBE デバッグ

呼び出し履歴でプロシーシャーを移動した時は、
ローカルウィンドウの内容は、移動した先のプロシージャーの変数に変わります。
再度F8等で進めた時は、再び実行中の変数の表示に戻ります。
※呼び出し元の変数の確認方法
ここで説明した方法やウォッチウィンドウを使った方法を次の章で詳しく説明します。

VBAの実行に問題がある場合、当該プロシージャーだけの問題ではなく、
呼び出し元で既に間違った処理が行われている場合が多々あります。
このような場合には呼び出し履歴を活用して原因を突き止めてください。


VBA実行途中で変数の状態を確認

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は説明用であり全く意味はありません。

「sample」を実行すると、エラーになります。

VBA VBE デバッグ

デバッグを選択すると、

VBA VBE デバッグ

0除算、つまり、(i - j)が0という事です。
イミディエイトウィンドウで、

VBA VBE デバッグ

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

VBA VBE デバッグ

変数が全て一覧で見られて便利ですね。
しかし、そもそも呼び出し元の「sample_sub1」の変数はどうなっているの?
これはローカルウィンドウで見ることができません。

呼び出し履歴とローカルウィンドウで変数の内容を確認

「呼び出し履歴」でプロシージャーを移動すると、そのプロシージャーの変数を見ることができます。

VBA VBE デバッグ

特に複数個所から呼び出されている場合は、
「呼び出し履歴」でどこからよびだされたかは必ず確認しましょう。

VBA VBE デバッグ

ローカルウィンドウの中身が、呼び出し元の「sample_sub1」に変わります。
ただし、
「sample_sub2」の変数表示が消えてしまい、両方を同時に確認することはできないのが少々不便です。

マウスポインターを置いて変数の内容を確認

確認したいプロシージャーで変数にマウスポインターを重ねます。

VBA VBE デバッグ

取り急ぎ変数を確認したい時は簡単で良いでしょう。
しかし、カーソルを移動すると表示は消えていますますので、
多くの変数を確認したり、比較したりという用途には向きません。

ウォッチウインドウで変数の内容を確認

変数を選択して、ドラッグ&ドロップでウォチウィンドウに追加すると、
操作したプロシージャーの変数として追加されます。

VBA VBE デバッグ

ウォッチウィンドウでは変数名が同じでも、プロシージャーが違えばそれぞれで登録できます。
「対象」をみることで、どのプロシージャーの変数かを確認することができます。

ウォッチウィンドウの「式がTrueのときに中断」
ウォッチウィンドウの機能で、ある条件になった時にVBAを中断することができます。

VBA VBE デバッグ

VBA VBE デバッグ

機能としてはとても強力なものですが、
条件を判定する位置を指定できないので、少々使いづらいかもしれません。
この例では、
「i=j」の指定では、初期値0で成立してしまうので、別の式が必要になります。

エラー原因を特定する

上記の方法を組み合わせて、プロシージャーと変数の動きを確認し、そもそもの原因を特定していきます。

ここでの原因は、
sampleで作成した、「141421356237310」
sample_sub1で2桁ずつ取り出し、6,7桁目「13」
sample_sub2で、+1,-1した結果が「2,2」となり、(2-2)=0
これにより0除算が行われたという事になります。
もちろん、今回のVBAは全く意味がな言事は、再度言っておきます。


Debug.Print

Debug.Printとは
DebugオブジェクトのPrintメソッドです。
イミディエイトウィンドウにテキストを出力します。
メソッド実行後は、イミディエイトウインドウの内容は改行されます。

;(セミコロン)に続けて書かれた変数・定数・式の値は、改行されずに表示されます。
,(カンマ)に続けて書かれた変数・定数・式の値は、一定の字数間隔をあけて表示されます。

Tab(n)で列番号(出力位置)を指定できます。

エラーがでてから原因を特定するために変数の中を確認する場合、
エラー停止した時点では、既に変数が書き換えられていて、原因がはっきりしない場合も多々あります。

このような場合には、
変数の値をイミディエイトウィンドウに順次出力していくことで、その変遷を確認します。

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 デバッグ


Debug.Assert

Debug.Assertとは
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 デバッグ

式がFalseで中断する為、条件式の指定が分かりづらくなってしまう場合があると思います、
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 デバッグ


デバッグの最後に

VBA開発では、実際にコーディング(VBAコードを書いている)時間より、
動作テストと動作不具合のデバッグに費やされる時間の方が長いというのは良くあることですし、むしろ普通の事です。

もちろん、一発で正しく動作する場合もあるし、デバッグ時間の方がはるかに長くなる場合もあります。
従って、このデバッグ時間は、VBA開発の総時間に大きく影響します。

より素早く、より効率的に、デバッグできるように、VBEの使い方はしっかりと覚えておきましょう。




同じテーマ「マクロVBA入門」の記事

VBEの使い方:VBE画面の全体説明

・メニュー ・プロジェクト ・プロパティ ・その他のウィンドウ ・VBE画面の全体説明の最後に
VBEの使い方:ツールのオプション設定
・「メニュー」→「ツール」→「オプション」 ・編集 ・エディターの設定 ・全般 ・ドッキング ・ツールのオプション設定の最後に
VBEの使い方:ツールバー
・ツールバーの表示方法 ・デバッグ ・ユーザーフォーム ・標準 ・編集 ・ユーザー設定 ・ツールバーの最後に
VBEの使い方:右クリックメニューとヘルプ
・右クリックメニュー ・(F1) ・右クリックメニューとヘルプの最後に
VBEの使い方:ショートカットキーとコード編集
・VBEショートカット一覧 ・ショートカットキーの具体的な使い方 ・コメントアウト ・ショートカットとコード編集の最後に
VBEの使い方:イミディエイト ウィンドウ
・イミディエイト ウィンドウの表示 ・イミディエイト ウィンドウの基本的な使い方 ・イミディエイト ウィンドウの高度な使い方 ・イミディエイト ウィンドウの最後に
VBEの使い方:ローカル ウィンドウ
・ローカル ウィンドウの表示 ・ローカル ウィンドウの基本的な使い方 ・ローカル ウィンドウの制限 ・ローカル ウィンドウの最後に
VBEの使い方:ウォッチ ウィンドウ
・ウォッチ ウィンドウの表示 ・ウォッチ ウィンドウとは ・「ウォッチ式の追加」の操作手順 ・ウォッチ式の追加 ・ウォッチ ウィンドウの制限と注意 ・ウォッチ ウィンドウの最後に
VBEの使い方:オブジェクト ブラウザー
・オブジェクトブラウザーの表示 ・オブジェクトブラウザーの使い方 ・クラスおよびメンバーの見方 ・オブジェクトブラウザーの最後に
VBEの使い方:デバッグ


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ