デバッグトレースの開始方法

「デバッグ」って何ですか? 「デバッグ(Debug)」とは「バグ退治」のことで、記述したマクロを正しく動作するものに仕上げる作業のことです。
「マクロを[書いてみた][動かした][ダメでした]。」でも説明してありますが、マクロはコードを作成してからいきなり動かすものではありません。 いきなり動かして正しい結果が得られるなら、それはよほど単純なマクロなのか、作成者がマクロに精通した天才的な方なのかということになります。
次章VBE内の機能を説明していますが、ここではどうやって動作確認するのかの概要だけ説明しておきます。

まず、コンパイルチェックを行ないます。

コンパイルチェック

「コンパイル」はVBAでは事前に行なうものではなく、実行時に動的に行なわれます。 これを利用してチェックだけ行なうのが「コンパイルチェック」です。
「デバッグ」メニューにある「・・・Projectのコンパイル」を選択するだけです。これで構文エラーがあると上のようにメッセージで表示してくれます。メッセージを確認して修正を行なったら、再度、コンパイルチェックを行ないます。これは他にも構文エラーがあるかも知れないからです。何もメッセージが表示されなくなれば構文エラーはないということになります。
VBAではこの「コンパイル」は必須ではありません。これは単なる構文エラーのチェックに過ぎません。
実際には実行時にこの「コンパイル」が行なわれますから、この段階でエラーになるマクロは実行はされません。
また、「構文エラーがない」ことと、「正しく動作する」ことは全く別であり、「正しく動作する」かはテストで検証しなければなりません。

ここからがデバッグトレースの開始です。(実際の動作の検証)

VBAサンプルマクロ
(画像をクリックすると、このサンプルがダウンロードできます)

この「一連番号作成2」を題材にしてみます。 見たとおりの単純な処理で、A2行目から、A1セルに示される行まで一連番号を値でセットするというものです。

ここでは構文の説明は余り行ないませんが、少しだけ触れておきます。
For」から「Next」の間を「For」の右の条件で繰り返す処理です。
Cells」は自動記録で出てきた「Range」と同じようなものですが、「Range」が一般にセル範囲をA1参照形式で指定できるのに対し、「Cells」は行番号と列番号を指定して単一のセル指定します。ExcelVBAではかなり頻繁に(当たり前のように)使いますので、この辺りから理解しておいても良いでしょう。

先頭の「Dim」はプロシージャ内での変数の宣言です。 ここでは「lngRow」と「lngLineNo」の2つの変数を宣言します。 実際は「データ型」を明示すべきなのですが、「データ型」の説明はまだ先なので省略します。 省略した場合は、入れる値によってExcelが判断します。 「lngRow」は「For」の右の条件で指定されているので「2」から始まって「Cells(1, 1).Value」まで、つまり「1行目1列目の値=A1セルの値」まで1ずつカウントアップしながら「For」から「Next」の間の処理を繰り返します。
lngLineNo」はA列に実際に表示される一連番号の値です。 先頭で「0」がセットされていて、実際に「For」から「Next」の間でA列にセットされる前に1ずつカウントアップされます。

では、実際にこのプロシージャの動作を追ってみましょう。
ベテランの方であれば、ソースコードを見て検証するのも「デバッグ」のひとつであって、また、以前に利用していたソースコードを転用利用することも多く、転用部分は「デバッグ済み」という判断もできますから、 作成部分での「デバッグ」は一部に限られます。
このような場合は、次の「ブレークポイント」を使いますが、ここでは作成したマクロの先頭からをトレースする方法を説明します。一般に「ステップ実行」とも呼ばれます。
いずれにしても、Excelのワークシート側とソースコードのVBE側を両方見るので、スクリーン上に並んだ状態で作業するようにして下さい。

「ステップイン」でトレースを開始

ここでは実行する「マクロ名」を選択して「実行」ではなく、「ステップイン」をクリックします。
すると、VBE側では呼び出した「一連番号作成2」プロシージャの行が黄色に塗りつぶされて表示されます。
VBE側のウィンドウを選択した状態で、F8キーを押すと、宣言記述を飛ばして次の動作行に「黄色」の行が進みます。
F8キーを押し進めていって、セルの値をセットする記述の次に進めるとワークシート側も更新されるので、実際の動作が確認できるというわけです。
この方法であればソースコードのどの行に書かれていることがどのように動作するかが明確に理解できるはずで、所望の結果でないとか、エラーになってしまう場合に どの行の記述が悪いのかが特定でき、それを修正していって正しく動作するマクロに仕上げていきます。
この作業で問題があればそこで「リセット(■ボタン)」またはEscキーでマクロ動作を停止すればよく、 また、このような単純なループ処理であれば最初の数回の繰り返しを確認すれば後はOKとなるでしょうから、 その時はF5キーを押せばステップ実行は解除されて以降は通常動作で実行されます。

次は「ブレークポイント」です。
前の「ステップ実行」で問題箇所がある程度特定できた場合は、その箇所の修正を行なって再度デバッグを行なうわけですが、 問題箇所の手前は問題ないわけですからスキップしたいことになります。
このような時は「ブレークポイント」を使います。

ブレークポイントの設定

「ブレークポイント」とはマクロの動作を一時停止する箇所をソースコード上で指定することです。
画像の赤い矢印のところをマウスでクリックすることでこのような赤茶色の丸印でマークが付き、これでマクロを実行するとこの行で黄色に塗りつぶされて実行が停止します。
そこからはF8キーでステップ実行も可能なので「ステップイン」でここまで動作を行なったのと同じことになります。
「ブレークポイント」のマークは再度マウスでクリックすることで消すことができ、行を選択した状態ではF8キーでもオン/オフができます。 また、「デバッグ」メニューには「すべてのブレークポイントの解除」のメニューも用意されています。

特定条件などが成立した時だけ停止させる方法
充分にテスト検証を行なってから運用現場に引き渡したプログラムが後から不具合を起こすようなことも実際には発生します。
再現できる問題の場合はそのデータを使って再検証したいわけですが、この時もそのデータに出会う手前はスキップしたいことになります。

イベントプロシージャの先頭にStopを書く
これには「Stopステートメント」を使いますが、この画像の場合は「25行目の処理先頭で停止」ということになり、 このように条件を指定してマクロを停止させることができます。 この画像は実際に「25行目で停止」したところの画像です。
ここからの「デバッグ」は上記と同じです。

但し、この方法はソースコード上にデバッグのための記述を埋め込むことになるので、最終的に削除することを意識して運用する必要があります。