VBEでデバッグ入門

初級VBA

はじめに

 プログラムでエラーが発生したり、思うような動作をしてくれない場合は、プログラムの動作を観察して原因を突き止める必要があります。(このように不具合を解消する作業を「デバッグ」と言います。)

 VBE(Visual Basic Editor)は、プログラムを書いて実行するだけでなく、デバッグ機能も付いています。
 デバッグ作業は、主に2つの操作でプログラムを観察して動作を確認します。

 ・プログラムの一時停止
 ・変数やオブジェクトの内部を観察

 
 プログラムを一時停止するには、ブレークポイントを設置します。
 変数やオブジェクトの内部を観察するには、Debug.Print でイミディエイトウィンドウに値を表示させたり、ローカルウインドウで値を確認します。

ブレークポイントの使い方

 ブレークポイントの使い方は簡単です。コードウインドウの左側の枠部分をクリックしてプログラムを止めたい場所をマークします。

 変数の定義部分空白などには設定できません。
 ブレークポイントでプログラムが停止した時、そのコードはまだ実行されていない状態で停止していますので注意してください。

 ブレークポイントを解除したい場合は、設定されているブレークポイントをクリックすればOKです。

Stopコマンド

 ブレークポイントはVBEで設定しますが、Stopコマンドを使うとプログラムコード上で実行を一時停止させることができます。

 設定を解除したい場合は、Stopコマンドを削除するか、コメントアウトします。

ステップ実行

 ブレークポイントでプログラムを停止したら、変数オブジェクトの値を観察しますが、続きを実行するにはF5キー(Sub/ユーザーフォームの実行)などで再開できます。
 この場合、次のブレークポイントで停止するか、プログラムが終了するまで処理が進みます。
 
 ただ、この時ステップ実行を選択すれば1行づつ実行するなど少しずつ処理を進める事ができるようになります。
 ステップ実行には以下のような種類があります。

 ・ステップ イン (F8) 
   一行づつ実行。関数を呼び出した場合も移動して1行づつ実行。
   
 ・ステップ オーバー (Shift + F8)
   1行づつ実行するが、呼び出した関数は移動せずに実行して戻る。
   但し、呼び出した関数内にブレークポイントがあれば停止する。
   
 ・ステップ アウト (Ctrl + Shift + F8)
   現在の関数の最後まで実行する。
   但し、ブレークポイントがある場合は停止する。

 実際の進み方を示すために以下のような簡単なプログラムを用意しました。
 途中で、別の関数(プロシージャ)を呼び出しています。
 以下のようにブレークポイントを2カ所設置して動作を確認してみます。

ステップ イン (F8)の動作

 macro()内にカーソルを置いて、「実行」すると最初のブレークポイントで停止します。その後、F8キーでステップ インしていくと、1行づつ実行されていき、関数を呼び出した所からは、その関数へ移動して更に1行づつ実行して、最後まで行くと呼び出し元に戻って更に1行づつ実行されていきます。

ステップ オーバー (Shift + F8)の動作

 同じように「実行」して最初のブレークポイントで停止した後は、1行づつ実行されていきますが、関数を呼び出した所では、呼び出した関数へは移動せずに、次の行へ進んで行きます。
 但し、呼び出し先関数内にブレークポイントが設定されている場合は、そこで停止します。

ステップ アウト (Ctrl + Shift + F8)の動作

 ステップ アウトは、ステップ インで1行づつ実行し、関数の呼び出して移動した際、その関数を抜け出したい場合に利用します。 以下の例では⑤でステップ アウトを使っています。
 但し、呼び出し先関数内にブレークポイントが設定されている場合は、そこで停止します。

変数やオブジェクトの内部を観察

 ステップ実行などでプログラムを止め、その時点での変数やオブジェクトの状態を観察してプログラムが思い通りに進んでいるかを確かめます。

 変数やオブジェクトの内部を観察するためにVBEでは、Debug.Print でイミディエイトウィンドウに値を表示させたりローカルウインドウで値を確認する事ができます。

デバッグ プリント

 プログラムの途中で、「Debug.print」として引数に変数やオブジェクトのプロパティを渡すと、その時点の値をイミディエイトウィンドウに文字列として返してくれます。 プログラムを止めなくてもイミディエイトウィンドウで値を確認する事ができます。

ローカルウインドウ

 ステップ実行でプログラムを停止した際、現在使われている変数やオブジェクトの状態を現わしてくれます。
 プログラムが停止している黄色部分は、まだ実行されていない状態(次のステップで実行される)なので、変数やオブジェクトの値は、その直前の状態を示しています。

 上記の場合、i 1 となっていますが、total はまだ計算されていないため 0 のままになります。

まとめ

 デバッグの基本的な操作は、プログラムを止めながら、変数の値が思い通りに進んでいるかを確認して検証していきます。プログラムを組んでいると「こうなるはずだ」という先入観でミスに気付けない事が結構あります。
 実際に検証する事でプログラムの変更が必要になる事も結構あります。

 初心者の方はデバッグ作業が苦手かもしれませんが、むしろ慣れている人ほど良くデバッグ作業をしているように感じます。是非身に付けてください。

タイトルとURLをコピーしました