VBAウォッチウィンドウの使い方|3種類のウォッチで条件付きデバッグ

スポンサーリンク

VBAでマクロを作っていて「この変数、いつ値が変わったんだろう?」と悩んだことはありませんか。

Debug.Printで確認するのもいいけれど、ループが何百回もまわる処理では追いきれないですよね。ブレークポイントで止めても、毎回同じ場所で止まるだけで「特定の条件のときだけ見たい」には対応できません。

そんなときに頼りになるのがウォッチウィンドウです。この記事では、ウォッチウィンドウの表示方法から3種類のウォッチの使い分け、実務で役立つテクニックまで解説します。

VBAのウォッチウィンドウとは

ウォッチウィンドウは、VBE(Visual Basic Editor)に搭載されたデバッグ用のウィンドウです。指定した変数やプロパティの値をリアルタイムで監視できます。

「ウォッチ(Watch)」は英語で「監視する」という意味です。名前のとおり、マクロの実行中に変数の動きを見張ってくれます。

主にできることをまとめると、次のとおりです。

できること使う場面
変数やプロパティの値をリアルタイム表示ループ中に値の変化を追いたいとき
条件を満たしたら自動で一時停止特定の値になった瞬間を捉えたいとき
値が変わった瞬間に自動で一時停止いつ値が変わるか分からないとき
オブジェクトのプロパティを展開表示RangeやWorksheetの中身を確認したいとき

最大の特徴は「条件を指定して自動停止」ができる点です。これはVBEのデバッグツールの中でウォッチウィンドウだけが持つ機能です。VBEの画面全体の構成については、VBEの画面の見方を図解で解説をあわせてご覧ください。

デバッグウィンドウ3種の比較

VBEには3つのデバッグウィンドウがあります。それぞれの特徴を比較表で整理しておきましょう。

比較項目ウォッチウィンドウローカルウィンドウイミディエイトウィンドウ
監視対象自分で指定した変数のみプロシージャ内のすべての変数手動で入力した式
条件付き停止できるできないできない
値の変更検知できるできないできない
リアルタイム更新ステップ実行ごとに更新ステップ実行ごとに更新手動で入力が必要
向いている場面特定の変数を条件付きで監視全変数を一覧で確認値の確認や式のテスト

ローカルウィンドウは「全部見せてくれるけど、指定できない」タイプです。一方、ウォッチウィンドウは「見たいものだけを条件付きで監視できる」のが強みです。

VBEの起動とウォッチウィンドウの表示方法

ウォッチウィンドウを使うには、まずVBEを開く必要があります。

VBE(Visual Basic Editor)の開き方

VBEを開く方法は2つあります。

  • ショートカットキー: Alt + F11 を押す(最速の方法です)
  • リボンから開く: 「開発」タブ →「Visual Basic」をクリック

「開発」タブが表示されていない場合は、次の手順で追加してください。

  1. 「ファイル」タブ →「オプション」を開きます
  2. 「リボンのユーザー設定」を選びます
  3. 右側の一覧で「開発」にチェックを入れます
  4. 「OK」をクリックします

ウォッチウィンドウの表示手順

ウォッチウィンドウはデフォルトでは表示されていません。次の手順で表示します。

VBEの画面上部にある「表示」メニューをクリックし、「ウォッチ ウィンドウ」を選択します。VBE画面の下部にウォッチウィンドウが表示されます。

TIP

一度表示すれば、VBEを閉じるまでウォッチウィンドウは表示されたままです。毎回メニューから開く必要はありません。

なお、イミディエイトウィンドウにはCtrl + Gというショートカットがあります。しかしウォッチウィンドウにはデフォルトのショートカットキーが割り当てられていません。メニューからの表示方法を覚えておきましょう。

ウォッチ式の追加方法

ウォッチウィンドウを表示しただけでは、中身は空の状態です。監視したい変数やプロパティを「ウォッチ式」として追加しましょう。追加する方法は3つあります。

メニューから追加する

  1. VBEのメニューバーから「デバッグ」をクリックします
  2. ウォッチ式の追加」を選択します
  3. ダイアログが表示されるので「」欄に監視したい変数名を入力します
  4. 「OK」をクリックすると、ウォッチウィンドウに追加されます

たとえば、変数 i を監視したいなら「式」欄に i と入力するだけでOKです。

ドラッグで追加する

コード上の変数名をマウスで選択して、ウォッチウィンドウにドラッグ&ドロップする方法です。ダイアログを開かなくていいので、複数の変数をまとめて追加したいときに便利です。

右クリックメニューから追加する

コード上で監視したい変数名にカーソルを置いて右クリックします。「ウォッチ式の追加」を選択すると、変数名が「式」欄に入った状態でダイアログが開きます。そのままOKを押すだけなので手軽です。

ウォッチウィンドウの3種類のウォッチ

ウォッチ式を追加するとき、「ウォッチの種類」を選べます。この設定がウォッチウィンドウの真価を発揮するポイントです。

式ウォッチ(デフォルト)

式ウォッチ」は、指定した変数やプロパティの現在値をリアルタイムで表示するモードです。ウォッチ式を追加すると、デフォルトでこの設定になります。

マクロをステップ実行(F8)しながら、値がどう変化するかを確認するのに使います。

Sub SampleWatch()
    Dim i As Long       '--- カウンター ---
    Dim total As Long   '--- 合計値 ---
    total = 0
    For i = 1 To 10
        total = total + i
    Next i
    MsgBox total
End Sub

変数 itotal をウォッチ式に追加してみましょう。F8でステップ実行するたびに、値が更新されていく様子を確認できます。

式がTrueのときに中断

式がTrueのときに中断」は、指定した条件が成立した瞬間に自動でマクロを一時停止するモードです。

たとえば「i = 50」という条件を設定しておきます。Do Loopなどのループ処理が100回まわる中で、50回目だけを確認したいときに最適です。

設定方法は次のとおりです。

  1. 「ウォッチ式の追加」ダイアログを開きます
  2. 「式」欄に条件式を入力します(例: i = 50
  3. 「ウォッチの種類」で「式がTrueのときに中断」を選択します
  4. 「OK」をクリックします

ブレークポイントだと「毎回そこで止まる」のが難点です。このモードなら「条件を満たしたときだけ止まる」ので効率的です。

値が変更されたときに中断

値が変更されたときに中断」は、監視している変数の値が変わった瞬間に自動で一時停止するモードです。

どのタイミングで値が書き換わるか分からないバグの追跡に重宝します。「この変数、いつの間にか0になってる……」というケースですね。

設定方法は「式がTrueのときに中断」と同じです。ウォッチの種類を「値が変更されたときに中断」に変えるだけです。

NOTE

「式がTrueのときに中断」と「値が変更されたときに中断」は、マクロの実行速度にわずかに影響します。VBAがステップごとに条件を評価するためです。大量のウォッチ式を設定するとパフォーマンスが落ちることがあるので、必要最低限に絞りましょう。

3種類の使い分け早見表

どのモードを使えばよいか迷ったときは、次の表を参考にしてください。

やりたいこと選ぶウォッチの種類式の入力例
変数の値をリアルタイムで確認したい式ウォッチtotal
特定の条件で止めたい式がTrueのときに中断i = 50
エラーになる値を捉えたい式がTrueのときに中断price < 0
いつ値が変わるか調べたい値が変更されたときに中断flag
配列の要素数を追いたい式ウォッチUBound(arr)

実務で役立つ活用テクニック

基本的な使い方がわかったところで、実務で使える便利なテクニックを紹介します。

オブジェクトのプロパティを展開して確認する

ウォッチウィンドウでは、Range型やWorksheet型などのオブジェクト変数も追加できます。追加すると、中身をツリー形式で展開して確認できます。

たとえば Range("A1") をウォッチ式に追加してみましょう。Value、Row、Column、Font、Interiorなど、セルのプロパティが一覧で表示されます。

「フォントサイズって今いくつだっけ?」というとき、イミディエイトウィンドウに打ち込まなくても展開するだけで確認できます。

配列変数をウォッチウィンドウで確認する

ウォッチウィンドウには、配列変数も追加できます。たとえば Dim arr(99) As Long のような配列を「式」欄に arr と入力して追加します。

すると、ウォッチウィンドウに arr の行が追加され、左側に「+」ボタンが表示されます。この「+」をクリックすると、arr(0) から arr(99) まで全要素を展開して一覧で確認できます。

特定のインデックスだけを監視したいときは、arr(50) のようにインデックスを指定してウォッチ式に追加します。注目したい要素だけをピンポイントで見張れるので、画面がすっきりします。

大量要素の配列で「特定インデックスの値だけが壊れている」というバグを追うとき、この使い分けが効いてきます。

式を使った高度な監視

ウォッチ式の「式」欄には、単純な変数名だけでなく計算式や比較式も入力できます。

式の例用途
i変数iの値を表示
i > 100iが100を超えたらTrue
Len(myStr)文字列の長さを表示
Range("A" & i).Value動的なセル参照の値を表示
UBound(arr) - LBound(arr) + 1配列の要素数を表示

計算結果や関数の戻り値もリアルタイムで監視できます。複雑な処理のデバッグに役立ちます。

ウォッチ式の編集と削除

追加したウォッチ式を変更したいときは、ウォッチウィンドウ内の式をダブルクリックします。「ウォッチ式の編集」ダイアログが開きます。

不要になったウォッチ式を削除するには、対象の行を右クリックして「ウォッチ式の削除」を選択します。行を選択してDeleteキーを押してもOKです。

イミディエイトウィンドウと組み合わせる

ウォッチウィンドウで値の変化を監視しつつ、イミディエイトウィンドウで値を直接書き換える使い方が強力です。

たとえば、ウォッチウィンドウで total を監視中にしておきます。イミディエイトウィンドウで total = 0 と入力してEnterを押します。すると、ウォッチウィンドウの値もリアルタイムで更新されます。

「変数を0にリセットしたら処理はどう動く?」というシミュレーションが手軽にできます。

実務シナリオ別:ウォッチウィンドウが威力を発揮する場面

3種類のウォッチを実務でどう使うか、具体的なシナリオで見てみましょう。

シナリオA: 1万行ループの特定行でバグが出る

1万行を処理するループで、なぜか途中の1行だけ結果がおかしいとします。毎回ブレークポイントで止めていては日が暮れますよね。こんなときは、カウンター変数に i = 9999 という条件を設定し、「式がTrueのときに中断」を選びます。9999行目に到達した瞬間だけマクロが止まるので、その時点の各変数の状態をじっくり調べられます。

シナリオB: オブジェクト変数がいつNothingになるか分からない

セットしたはずのオブジェクト変数が、処理の途中でいつの間にか Nothing になっているケースです。obj Is Nothing という式を「式がTrueのときに中断」で設定しておけば、Nothingになった瞬間にマクロが止まります。「どこで参照が切れたのか」を一発で特定できます。

どちらもDo Loopなどのループ処理と組み合わせると、デバッグの手間が大幅に減ります。

ウォッチウィンドウのよくあるトラブルと対処法

使っていて「あれ?」となることがあるかもしれません。よくあるトラブルをまとめました。

[faq q="ウォッチウィンドウに「範囲外」と表示されます。" a="マクロが実行中でないか、監視している変数のスコープ外で止まっています。F8キーでステップ実行中に確認してください。"]
[faq q="ウォッチウィンドウの値が更新されません。" a="マクロが一時停止していない状態です。ブレークポイントまたはStop文でマクロを一時停止してから確認してください。"]
[faq q="ウォッチウィンドウが消えてしまいました。" a="誤って閉じたか、VBEを再起動したためです。VBEの「表示」メニューから「ウォッチ ウィンドウ」を選択して再表示してください。"]
[faq q="ウォッチ式でエラーが表示されます。" a="変数名のスペルミスか、スコープの違いが原因です。ウォッチ式をダブルクリックして式を編集・修正してください。"]
[faq q="ウォッチ式を追加したらマクロが遅くなりました。" a="ウォッチ式を大量に設定すると処理速度に影響します。デバッグが終わったら不要なウォッチ式を削除して数を絞ってください。"]

TIP

ウォッチウィンドウに追加した式は、VBEを閉じるとリセットされます。次回VBEを開いたときは再度追加が必要です。頻繁に使うウォッチ式がある場合は、コード内にコメントとしてメモしておくと便利です。

まとめ

ウォッチウィンドウは、VBAのデバッグ作業を効率化してくれる強力なツールです。

ポイントをおさらいしましょう。

  • 表示方法: VBEの「表示」メニューから「ウォッチ ウィンドウ」を選択
  • ウォッチ式の追加: メニュー・ドラッグ・右クリックの3つの方法
  • 式ウォッチ: 変数の値をリアルタイムで監視
  • Trueのときに中断: 条件を満たしたら自動停止
  • 値変更時に中断: 値が変わった瞬間に自動停止
  • オブジェクト展開: Rangeなどのプロパティをツリー形式で確認

Debug.Printだけでデバッグしていた方は、「条件付き中断」を試してみてください。ループ処理のデバッグがかなり快適になるはずです。

VBEにはウォッチウィンドウ以外にもデバッグに役立つウィンドウがあります。あわせてチェックしてみてくださいね。

あわせて読みたい

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