VBA のデバッグの基本(ステップ実行・ブレークポイント・イミディエイトウィンドウ・ウォッチ)
マクロが思ったとおりに動かないときに、どこで何が起きているかを確かめるためのデバッグ機能を解説します。F8 のステップ実行、ブレークポイント、Debug.Print、ローカルウィンドウ、ウォッチの使い分けです。
デバッグ機能を使う理由
マクロがエラーで止まる場合も、止まらずに間違った結果を出す場合も、原因を探すには「その時点で変数に何が入っているか」「どの行を通ったか」を確かめるのが近道です。コードを眺めて推測するよりも、実際に1行ずつ動かして中身を見る方が、ずっと早く原因にたどり着けます。
VBE(Visual Basic Editor)には、そのための機能が標準で用意されています。どれも追加の設定なしで使えるので、基本の操作だけでも覚えておくと、エラー対応の時間が大きく減ります。
ステップ実行とブレークポイント
ステップ実行は、マクロを1行ずつ止めながら実行する機能です。マクロの中にカーソルを置いて F8 キーを押すと、最初の行が黄色く表示され、F8 を押すたびに1行ずつ進みます。止まっている間に変数の上にマウスを重ねると、その時点の値が表示されます。
数千行のループを1行ずつ進めるのは大変なので、調べたい行の左端の灰色の部分をクリックして「ブレークポイント」(茶色の丸)を置き、F5 で実行します。マクロはその行の直前で止まるので、そこから F8 で細かく確認します。
- F8:1行ずつ実行(呼び出し先のプロシージャの中にも入る)
- Shift+F8:呼び出し先のプロシージャは一気に実行し、次の行で止まる
- Ctrl+Shift+F8:今のプロシージャの残りを実行して、呼び出し元に戻る
- Ctrl+F8:カーソルのある行まで実行して止まる
- F9:カーソルのある行にブレークポイントを置く・外す
イミディエイトウィンドウと Debug.Print
イミディエイトウィンドウ(Ctrl+G で表示)は、変数の値を確認したり、1行だけの命令を試したりできる場所です。マクロが止まっている状態で「? 変数名」と入力して Enter を押すと値が表示され、「? TypeName(変数名)」で型も確認できます。
コードに Debug.Print を書いておくと、実行中の値をイミディエイトウィンドウに書き出せます。MsgBox と違って処理が止まらないので、ループの中でどの行がおかしいかを一覧で確認したいときに便利です。次の例では、数値でない金額を見つけた行番号を書き出し、最後に合計を確認しています。
Sub DebugSample()
Dim ws As Worksheet, lastRow As Long, i As Long
Dim total As Currency, v As Variant
Set ws = ThisWorkbook.Worksheets("明細")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Debug.Print "最終行:" & lastRow
For i = 2 To lastRow
v = ws.Cells(i, "E").Value
If IsNumeric(v) And Not IsEmpty(v) Then
total = total + CCur(v)
Else
Debug.Print i & " 行目の金額が数値ではありません:[" & ws.Cells(i, "E").Text & "]"
End If
Next i
Debug.Assert total > 0 ' 合計が0以下ならここで止まる
Debug.Print "合計:" & total
End Subローカルウィンドウとウォッチ
ローカルウィンドウ(「表示」メニューから表示)には、止まっているプロシージャのすべての変数が、値と型の一覧で表示されます。配列は「+」を開くと中身を1つずつ確認できるので、セル範囲から読み込んだ配列の行と列が想定どおりかを確かめるのに役立ちます。
ウォッチ式は、特定の変数や式を見張る機能です。変数を選んで右クリックし「ウォッチ式の追加」を選ぶと、ウォッチウィンドウに常に表示されます。種類で「値が変更されたときに中断」や「式が True のときに中断」を選ぶと、たとえば「i = 1500」や「total < 0」になった瞬間にマクロを止められます。何行目で値がおかしくなるか分からないときに特に有効です。
デバッグで気を付けること
ステップ実行中も、シートへの書き込みやファイルの保存は実際に行われます。本番のデータで試す前に、ブックのコピーを使うようにしてください。また、Application.ScreenUpdating = False にしたままステップ実行すると画面が更新されず、セルの変化が見えないので、確認中はその行をコメントにしておくと分かりやすくなります。
- Debug.Print の出力は残り続けるので、調べ終わったら削除するかコメントにする
- Debug.Assert やブレークポイントで止めたまま放置しない(リセットボタンで終了する)
- コードに Stop を書いて止める方法もあるが、配布前に必ず消す
- On Error Resume Next があるとエラーの行で止まらないため、調べる間は一時的にコメントにする