ワードマクロの動作がおかしいとき、VBEを使ったデバッグが便利です。
やり方は記事「ワードマクロ:VBEでマクロの動作がおかしいときのテストのやり方」に紹介しています。
この記事では、ブレークポイントで実行一時停止中に、ステップイン、ステップオーバー、ステップアウトの動作の違いについて実例をもとに説明します。
3つのステップ実行の違い
動作の違いは以下のとおりです。
- ステップイン
1行だけ実行を進めます。もしステートメントがプロシージャ呼び出しの場合、そのプロシージャの中の1行だけ実行します。 - ステップオーバー
1行だけ実行を進めます。もしステートメントがプロシージャ呼び出しの場合、そのプロシージャは全て実行してしまいます。 - ステップアウト
プロシージャを全て実行し呼び出し元まで処理が戻ります。
実際にどうなるのか、以下のプログラムで説明します。
テストするプログラム
下図のように、「ステップ実行テスト」マクロから、「insert_text」というSubプロシージャを引数付きで2回呼び出します。
ステップイン
ステップインは1行ごとに実行を進めます。次に実行するステートメントがプロシージャだったら、そのプロシージャの最初の1行だけ実行されます。
下図では、黄色で塗られたプロシージャ呼び出しが次に実行されるステートメントになってます。ここで、ステップインをクリックして、処理を進めると・・・・・
下図のようにプロシージャの中にローカルが移動しました。
下方のローカルウィンドウの変数も、呼び出された 「insert_text」プロシージャの中の変数が表示されています。
ステップオーバー
ステップオーバーも1行ごとに実行を進めます。次に実行するステートメントがプロシージャだったら、ステップオーバーの場合、そのプロシージャを完全に実行して次のステートメントに進みます。
下図では、ステップインの場合と同様に、黄色で塗られたプロシージャ呼び出しが次に実行されるステートメントになってます。
ここで、ステップオーバーをクリックして、処理を進めると・・・・・
下図のように、実行中のプロシージャの中で1ステートメント実行されました。
ステップインに比べ、ドサッと実行が進みます。
ステップアウト
プロシージャを全て実行し呼び出し元まで処理が戻ります。マクロのように、ユーザに実行されたマクロのように一番外の階層のプロシージャの場合、マクロの実行が終わります。
下図のように、「ステップ実行テスト」プロシージャから「insert_text」プロシージャを呼び出して「insert_text」プロシージャの中で実行を一時停止している状態で、ステップアウトをしてみると・・・・
ステップアウトでは、その時に実行していたプロシージャのステートメントは全て実行し、呼び出し元のプロシージャに文脈(実行しているプロシージャ)が戻りました。
コメント