VBAオジサンのらくがき帳

#14 コードの不具合を修正する(デバッグ)

2021-03-28 00:00:00

マクロを実行してエラーが発生したり、思い通りの結果にならなかったりするときには、その原因(バグ)を見つけて修正する(デバッグする)必要があります。しかしコードを読んで原因を探すのは大変な作業です。エクセルのVBエディタには、原因の確認のためプログラムを少しずつ動かしたり、実行中の変数の値を表示させたり、デバッグのために活用できる機能がありますので紹介します。

デバッグツールバー

デバッグ用の機能を集めたデバッグツールバーが用意されています。表示されていない場合は、表示メニューのツールバーから追加できます。ショートカットキーが用意されているのでよく使う場合はを覚えるといいかもしれません。

ステップ実行

サブプロシージャの中にカーソルを合わせステップイン(F8)を行うと、そのプロシージャの始まりからコードを1行ごとに実行することができます。ステップオーバー(Shift+F8)はステップインと似ていますが、他のサブプロシージャの呼び出しも一つのステップで処理されます。ステップアウト(Ctrl+Shift+F8)は現在実行中のサブプロシージャの最後まで一つのステップで処理されます。ツールバーのボタンはありませんが、Ctrl+F8を使うと現在のカーソルの地点までの処理を実行します。

ブレークポイント

コードのある行まで処理を実行し、いったん止めたいという場合にはブレークポイントを使用します。対象の行にカーソルを合わせて、F9キー、ツールバーのボタンまたはテキストエディタ左のスペースのクリックにより設定できます。空白行や、変数宣言などブレークポイントを設定できない行もあります。

ブレークポイントを設定した状態でマクロを実行するとブレークポイントの前で止まります。この状態から、ステップインなどを使って動作を確認することもできますし、実行ボタンにより次のブレークポイントまたはプロシージャの終了までの処理を継続することができます。

イミディエイトウィンドウ

イミディエイトウィンドを利用するとマクロの実行中のいろいろな情報を得ることができます。ウィンドウが表示されていない場合は表示メニューより追加が可能です。

プロシージャ内でDebug.Printメソッドを利用すると、イミディエイトウィンドウへのテキスト出力ができます。

下のように変数の値やメッセージを出力することができます。

Dim v As Long
v = 100
Debug.Print v
Debug.Print Range("A1").Value
Debug.Print "処理完了"

ある処理(下の例ではProc1)にかかる時間を調べるには下のように前後で時刻を出力すると便利です。

Debug.Print "Point1 - " & Now
Proc1
Debug.Print "Point2 - " & Now

イミディエイトウィンドウに「?」のあとに変数や関数やプロシージャを続けて、行末でEnterキーを押すと、値や戻り値を表示することができます。

ステップ実行中は変数の値を表示させることもできます。セルの情報を取得したり、関数の確認などを行う時に便利です。

? v '変数vの値を表示
? Selection.NumberFormat '選択セルの書式の表示
? Selection.FormulaR1C1 '選択セルの式をR1C1参照形式で表示
? Format(Now, "yyyymmdd") 'Format関数
? Mid("abc", 2, 1) 'Mid関数

先頭に「?」を置かずにEnterを押すと、何も出力しないで関数やサブプロシージャを実行することができます。

MsgBox "hello"