VBA デバッグの仕方

はじめに

Excel VBA マクロのデバッグの仕方を紹介します。

デバッグとは、プログラムがどのように実行されているか調査することです。VBA マクロに不具合があるときに、変数の値や処理の流れなどが意図したとおりになっているかデバッグして、問題となっている原因を突き止めます。

F8 キーから実行すると、1 行ずつステップイン実行できます。

ブレークポイントを設定してそこで処理を中断できます。

ツール > オプション > 全般 > エラー発生時に中断 を選択して、エラー発生時に処理を中断できます。

Debug.Print(変数名) から、変数の値をイミディエイトウィンドウに出力できます。

  • 目次
    • 1 行ずつ実行する
    • ブレークポイントを設定する
    • エラー発生時に中断する
    • ウォッチウィンドウ
    • ローカルウィンドウ
    • イミディエイトウィンドウ

1 行ずつ実行する

VBA を実行するには F5 キーを入力しますが、F8 キーを入力して実行すると、最初のコードから 1 行ずつステップインして実行できます。

デバッグ用のショートカットキーを使うと便利です。

  • ステップイン:1 行だけ処理を進めます。それが自作の関数なら、関数の中に移動します。
  • ステップオーバー:1 行だけ処理を進めます。それが自作の関数ならその関数の処理をすべて実行します。
  • ステップアウト:今実行している関数を抜けるまで処理を進めます。
20

特定の場所まで処理を進めたいときはブレークポイントを設定します。

ブレークポイントを設定する

ブレークポイントを設定すると、設定した場所で処理が中断し、その時点の変数の状態を確認できます。これを使って意図しない動作になっていないか調べられます。

ブレークポイントを設定するコードの [左側の部分] をクリックします。

16

ブレークポイントを設定すると、その行が赤くなります。ブレークポイントはいくつでも設定でき、もう一度クリックすると解除できます。

17

コードを実行すると、ブレークポイントを設定した行で処理が止まります。黄色くなっている行が、次に実行されるコードです。

18

変数の上にマウスカーソルを合わせると、変数の値を確認できます。

19

処理を再開するには F8 キー入力して 1 行ずつステップイン実行したり、F5 キーを入力して次のブレークポイントまたは最後まで処理を進められます。

処理を移動する

次に実行する処理を、関数の中で好きな行に移動できます。

[黄色い矢印] を実行したい行までドラッグします。上下の好きな行に移動できます。

26

その行に処理が移動し、そこから再開できます。

27

上の行に移動しても変数の状態が戻るわけではありません。次に実行するコードが上の行に移動しただけです。

このようにブレークポイントで処理を中断して、変数の値を確認したり、IF 文などの分岐が意図したとおりになっているかステップインしたり、確認しながら処理を進めていくのがデバッグです。

エラー発生時に中断する

エラーが発生したときに処理を中断するには [ツール] をクリックして [オプション] をクリックします。

option

[全般] タブから [エラー発生時に中断] を選択して [OK] をクリックします。

35

エラーが発生したら [デバッグ] をクリックします。

36

エラーが発生した処理で中断します。

37

その時の変数の値などを確認して原因を突き止めます。

詳しくは「エラー発生時に中断する」をご覧ください。

ウォッチウィンドウ

「ウォッチウィンドウ」から変数の値を常に監視できます。

[表示] から [ウォッチウィンドウ] をクリックします。

29

「ウォッチウィンドウ」が表示されます。

監視したい [変数] をダブルクリックして [ウォッチウィンドウ] にドラッグします。

30

ステップイン実行やブレークポイントで処理を中断するとその時点の値を確認できます。ステップインで 1 行ずつ処理を進めていくと、変数の値が変更されるたび、ウォッチウィンドウにも反映されているのがわかります。

31

これで、変数の値を確認するのが楽になります。

「ウォッチウィンドウ」から変数を削除するには、その [変数] を選択した状態で Delete キーを入力します。

32

ローカルウィンドウ

「ローカルウィンドウ」からローカル変数の値を自動で監視できます。

[表示] から [ローカルウィンドウ] をクリックします。

33

「ローカルウィンドウ」が表示されます。

ステップイン実行やブレークポイントで処理を中断すると、その関数のローカル変数の値を確認できます。

34

ウォッチウィンドウに変数をドラッグしなくても自動で確認できるので便利です。

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

「イミディエイトウィンドウ」に変数の値を出力したり、コードを実行できます。

[表示] から [イミディエイトウィンドウ] をクリックします。

21

「イミディエイトウィンドウ」が表示されます。

値を確認

?変数名 の後に Enter キーを入力します。

22

処理が中断している時点の変数の値が出力されます。

23

?関数名 の後に Enter キーを入力します。Function 関数の戻り値が出力されます。

28

コードに Debug.Print(変数名) のように入力すると、その時点の変数の値を出力できます。

Sub 実行()
    Dim 変数 As Integer
    変数 = 10
    Debug.Print(変数)
    変数 = 20
    Debug.Print(変数)
    変数 = 30
    Debug.Print(変数)
End Sub
24

Debug.Print は VBA のイミディエイトに表示されるだけでエクセルの画面には表示されないので、デバッグ用のコードを残したままマクロを実行できます。

Tipsfound ではサンプルコードの多くに Debug.Print を使用しています。これで動作確認しやすくなっていると思います。

値を代入

変数名=値 の後に Enter キーを入力します。

25

その変数に値が代入されます。

この機能は上記の「処理を移動する」で使うと便利です。イミディエイトウィンドウで変数の値を変えながら、処理を戻して動きを確認できるため、何度も VBA を実行する手間が省けます。

関数を実行

関数名 の後に Enter キーを入力します。標準モジュールに Public で宣言されているか VBA の関数のみ実行できます。Sheet1 やクラスの関数は実行できません。

VBA を実行していなくても、その関数を実行できるので動作確認に便利です。