【Excel VBA】マクロの動作を途中で確認する方法 — ステップ実行・イミディエイトウィンドウ

この記事は約7分で読めます。

マクロが思った通りに動かないとき、どこで何が起きているのかを1行ずつ確かめる方法を紹介します。

この記事で分かること

  • ブレークポイントを置いて、マクロを途中で止める方法
  • F8 のステップ実行で、1行ずつ進める方法
  • イミディエイトウィンドウと Debug.Print で、変数の値を確かめる方法
  • ウォッチ式で、1つの変数を見張り続ける方法

読み終えると、次のようにマクロを途中で止めて、変数の値をその場で確かめられます。

ブレークモードでIf行に止まり、イミディエイトウィンドウで ?stock の値 40 を確認した状態

どんな場面で使うか

  • 自作や引き継いだマクロが、期待した結果にならない
  • ループの途中で、変数がどう変わっているかを見たい
  • If の条件で、どちら側に入っているか分からない

基本説明

使うデータ

サンプルファイル(記事末尾)の「在庫」シートを使います。

「在庫」シートの元データ(A1:C6。A列=商品コード、B列=在庫数、C列=発注点、2〜6行目に5件)

A列が商品コード、B列が在庫数、C列が発注点です。データは2〜6行目の5件です。

使うマクロ

在庫数が発注点を下回っている商品を数えるマクロです。Debug.Print で、1件ごとの値をイミディエイトウィンドウに出します。

Option Explicit

Sub 発注点を下回る商品を数える()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim stock As Long
    Dim point As Long
    Dim shortageCount As Long

    Set ws = ThisWorkbook.Worksheets("在庫")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        stock = ws.Cells(i, "B").Value
        point = ws.Cells(i, "C").Value
        Debug.Print ws.Cells(i, "A").Value & " : 在庫" & stock & " / 発注点" & point

        If stock < point Then
            shortageCount = shortageCount + 1
        End If
    Next i

    MsgBox "発注点を下回っている商品数 : " & shortageCount, vbInformation, "在庫チェック"
End Sub

正しく動けば、答えは2件(A-1001とA-1003)です。

途中経過を見る道具

道具 すること 向いている場面
ブレークポイント 指定した行でマクロを止める 調べたい場所まで一気に進めたい
F8(ステップ実行) 1行だけ進める どの行で値が変わるかを突き止めたい
イミディエイトウィンドウ ?変数名 で、その時点の値を表示する 値を1回だけ確かめたい
Debug.Print 止めずに、値をイミディエイトウィンドウに出す 全件の経過をあとで読みたい
ウォッチ式 1つの変数の値を表示し続ける 同じ変数をずっと追いたい

止まっている状態をブレークモードと呼びます。タイトルバーに「[中断]」と出て、次に実行する行が黄色く表示されます。

手順(サンプルで動作確認する)

ステップ1 マクロを貼り付ける

  1. サンプルファイルを開き、Alt+F11 でVBEを開く
  2. 「挿入」→「標準モジュール」を選ぶ
  3. 上の「使うマクロ」を貼り付ける
  4. 貼り付けたマクロの中(Sub 〜 End Sub のあいだ)をクリックしておく

サンプルは .xlsx 形式でマクロを保存できないので、保存せずにそのまま実行します。

ステップ2 ブレークポイントを置いて実行する

  1. If stock < point Then の行の左端(灰色の余白)をクリックする。赤い点が付く
  2. F5 を押してマクロを実行する

If の行が黄色くなって止まれば成功です(1周目・A-1001)。

赤い点は、もう一度クリックすると消えます。F9 でも付け外しできます。

ステップ3 イミディエイトウィンドウで値を見る

  1. Ctrl+G でイミディエイトウィンドウを表示する
  2. ?stock と入力して Enter を押す
  3. ?point と入力して Enter を押す
?stock
 40
?point
 50

40 と 50 が表示されれば成功です。冒頭の画像は、?stock まで入力した状態です。

すでに A-1001 : 在庫40 / 発注点50 の行も出ています。止まる前に Debug.Print の行を通ったためです。

ステップ4 F8 で1行ずつ進める

  1. F8 を押す → 黄色い行が shortageCount = shortageCount + 1 に移る
  2. F8 をもう一度押す → 黄色い行が End If に移る

40 は 50 より小さいので、If の中に入りました。End If の行でも1回止まります。

ステップ5 ウォッチ式で shortageCount を見張る

  1. コードの中の shortageCount をダブルクリックして選ぶ
  2. 右クリックして「ウォッチ式の追加」を選ぶ
  3. 「式」の欄が shortageCount になっていることを確かめて、「OK」を押す

ウォッチウィンドウに shortageCount の値 1 が表示されれば成功です。

ステップ6 F5 で次の周回へ進む

  1. F5 を押す → 2周目(A-1002)の If の行でまた止まる
  2. ?stock で 120 を確かめる。120 は 50 より大きいので、shortageCount は 1 のまま
  3. F5 を押す → 3周目(A-1003)で止まる。?stock は 15
  4. F8 を2回押す → ウォッチウィンドウの shortageCount が 2 に変わる

ブレークポイントがループの中にあるので、F5 を押すたびに次の周回の同じ行で止まります。

ステップ7 ブレークポイントを消して最後まで実行する

  1. 赤い点をクリックして消す
  2. F5 を押す

メッセージボックスに「発注点を下回っている商品数 : 2」と表示されれば成功です。イミディエイトウィンドウには、Debug.Print の出力が A-1001〜A-1005 の5件出ています(途中で入力した ?stock などの行も間に残ります)。

A-1005 は在庫数と発注点が同じ30なので、「未満」の条件には当たりません。

よくあるエラー

止まらずに、最後まで(または次の周回まで)進んでしまった

原因: F8 のつもりで F5 を押しています。F5 は次のブレークポイントまで一気に進み、無ければ最後まで実行します。

直し方:

  1. メッセージボックスが出ていれば「OK」で閉じる。まだ止まっていれば、VBEの「リセット」ボタン(■)で止める
  2. イミディエイトウィンドウの中で Ctrl+A →Delete を押し、前の出力を消す
  3. If の行に赤い点が残っているか確かめる。無ければステップ2の1で付け直す
  4. マクロの中(Sub 〜 End Sub のあいだ)をクリックしてから、F5 を押す

1周目の If の行で止まるので、ステップ3から続けます。

イミディエイトウィンドウで、値の代わりにエラーが出る

原因: ? を付け忘れています。イミディエイトウィンドウは、入力した内容をそのまま実行しようとします。

直し方: 値を見るときは ?stock のように ? から始めます。? は半角で入力します。

ウォッチ式に「<対象範囲外>」と表示される

原因: マクロの実行が終わると、Sub の中で Dim した変数は無くなります。壊れたわけではありません。

直し方: そのままで問題ありません。最後の件数は、メッセージボックスで確かめます。

配ったマクロが、相手の環境で途中で止まる

原因: デバッグ用に書いた Stop 文が残っています。ブレークポイント(赤い点)はファイルに保存されませんが、Stop はコードとして残ります。

直し方: 配る前に、コードの中の Stop を探して消します。

まとめ

  • 動かないマクロは、まずブレークポイントで止めて F8 で1行ずつ進める
  • 値を1回だけ見る → イミディエイトウィンドウで ?
  • 止めずに全件の経過を見る → Debug.Print
  • 1つの変数を追い続ける → ウォッチ式
  • 配る前に Stop が残っていないか確かめる

「なんとなく動かない」を「この行でこの値になっている」まで絞り込めれば、直す場所も決まります。

関連記事

サンプルファイル

記事中で使用しているサンプルデータはこちらからダウンロードできます。

タイトルとURLをコピーしました