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

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

VBEの使い方:デバッグ


VBE(Visual Basic Editor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。
ここではVBA開発で、重要かつ避けて通れないデバッグについて説明します。。


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

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コードの各行を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で説明を進めます。



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の使い方:ショートカットキーとコード編集
VBEの使い方:イミディエイト ウィンドウ
VBEの使い方:ローカル ウィンドウ
VBEの使い方:ウォッチ ウィンドウ
VBEの使い方:オブジェクト ブラウザー
VBEの使い方:デバッグ


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

SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP BY,ORDER BY)|SQL入門(11月30日)
データの取得:条件指定(SELECT,WHERE)|SQL入門(11月29日)
データの挿入:バルクインサート|SQL入門(11月28日)
データの挿入(INSERT)と全削除|SQL入門(11月26日)
テーブル名変更と列追加(ALTER TABLE)とテーブル自動作成|SQL入門(11月25日)
テーブルの作成/削除(CREATE TABLE,DROP TABLE)|SQL入門(11月24日)
データベースに接続/切断|SQL入門(11月23日)
SQLiteのインストール|SQL入門(11月22日)
SQL入門:VBAでデータベースを使う|エクセルの神髄(11月22日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • VBEの使い方:デバッグ

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


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



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