プログラム作成後のデバッグはプログラミングをするうえで避けることがでできません。
そこで今回は、VBAでデバッグを行う上で便利なステップ実行の機能について調べました。
準備
ステップ実行とはプログラムをある区切ごとに実行する機能であり、これによってプログラムが実際にどのように動くか把握することができます。
しかし普通にVBAのプログラムを実行すると最初から最後まで止まらずに実行してしまうため、ステップ実行を行う前にプログラムを停止させる位置を指示する必要があります。
プログラムの停止位置を指定する方法として次の二つがあります。
- ブレイクポイント
- Stop ステートメント
ブレイクポイントの設定
ブレークポイントを指定する方法は簡単です。
プログラムのコードからブレークポイントに指定したい行を選び、「 F9 」を押せばブレークポイントに指定できます。
ブレークポイントに指定すると次の図のように、左端に赤丸マークがつきます。
ブレークポイントの解除はブレークポイントの設定と同様に、解除したい行を選び「 F9 」を押せば解除されます。
また「 Ctrl + Shift + F9 」ですべてのブレークポイントを解除することができます。
Stopステートメントの使用
Stopステートメントを使用する場合には、図のようにコードに直接Stopステートメントを記述します。
Stop ステートメントはブレークポイントのように一括で解除することはできません。
そこで以前調べた 条件付きコンパイルを併用して使用すると便利です。
使用コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Option Explicit Sub test2() MsgBox "test2 start" Stop test3 MsgBox "test2 end" End Sub Sub test3() Dim i As String i = "test3" MsgBox i End Sub |
このコードは「 test2 」実行後、最初にメッセージボックスで”test2 start”を表示します。
また「 test2 」内に「 Stop 」ステートメントがありますので、その位置で一度プログラムは停止します。
「 Stop 」ステートメントを実行した後「 test3 」を実行し、メッセージボックスで”test3”と表示します。
その後「 test2 」に戻り、メッセージボックスに”test2 end”表示後終了します。
ステップイン
ステップインとはコードを一行ずつ実行していきます。
ステップイン時に関数等を呼び出すとその呼び出した関数の中へ飛び、その関数内の処理を一行づつ実行していきます。
とんだ先の関数が終了すると、呼び出し元に戻ります。
それでは先ほどのコード でステップインを実行していきます。
- 「 test2 」実行後メッセージボックスで”test2 start”が表示され、「 Stop 」ステートメントでプログラムは停止します。
- ステップイン(F8)実行後「 test3 」を呼び出し、「 test3 」内を一行ずつ実行していく。
- 「 test3 」終了後、「 test2 」に復帰し、”test2 end”を表示後終了
ステップオーバ
ステップオーバとはステップインと同様にコードを一行ずつ実行していきます。
しかし、ステップイン時に関数等を呼び出すとその呼び出した関数の中へ飛びましたが、ステップオーバでは関数内には飛ばず、処理終了後次の行へ進みます。
それでは先ほどのコード でステップオーバを実行していきます。
- 「 test2 」実行後メッセージボックスで”test2 start”が表示され、「 Stop 」ステートメントでプログラムは停止します。
- ステップオーバ(Shift + F8)実行後「 test3 」を呼び出し実行します。
- “test2 end”を表示後終了
ステップアウト
ステップアウトはステップイン等で呼び出した関数内から呼び出し元に戻る機能です。
それでは先ほどのコード でステップアウトを実行していきます。
- 「 test2 」実行後メッセージボックスで”test2 start”が表示され、「 Stop 」ステートメントでプログラムは停止します。
- ステップイン(F8)実行後「 test3 」を呼び出し、「 test3 」へ飛びます。
- ステップアウト(Ctrl + Shift + F8)実行後「 test3 」内の処理をすべて行い、「 test2 」に復帰
- “test2 end”を表示後終了
まとめ
- ステップ実行を使用することで、コードの挙動を一行ごとに確認することができる。
- ステップ実行を実行する前にブレイクポイントの設定もしくはStop ステートメントをコード内に記述する必要がある。
- ステップインによってコードを一行ごとに実行できる。またステップインでは呼び出し関数内に飛ぶことができる。
- ステップオーバもステップイン同様に一行ごとにコードを実行できる。しかし、ステップオーバでは呼び出し関数内には飛べない。
- ステップアウトによって呼び出し関数内から呼び出し元へすぐに復帰できる。