VBAローカルウィンドウの使い方|変数の値を一覧で確認してデバッグを効率化

スポンサーリンク

VBAでマクロを作っていて「この変数、今どんな値が入ってるの?」と確認したくなること、よくありますよね。

MsgBoxで1つずつ表示させる方法だと、変数が増えるたびにコードが煩雑になります。Debug.Printも便利ですが、変数が10個も20個もあると追いきれません。

そんなときに頼りになるのが ローカルウィンドウ です。表示するだけで、プロシージャ内のすべての変数と値が一覧で見えます。この記事では、表示方法からステップ実行との組み合わせ、他のデバッグウィンドウとの使い分けまで解説していきますね。

NOTE

VBEの起動方法や画面の見方は「VBE画面の見方」で解説しています。Alt + F11 でVBEを起動し、「挿入」→「標準モジュール」でコードを書く準備ができます。対象環境はExcel 2016以降(Microsoft 365含む)です。

VBAのローカルウィンドウとは?

ローカルウィンドウは、VBE(Visual Basic Editor)に搭載されている デバッグ用のウィンドウ です。実行中のプロシージャ(Sub〜End Sub)に含まれる すべての変数の名前・値・データ型 を自動的に一覧表示してくれます。VBAの変数の使い方がまだ不安な方は、先にそちらを確認しておくと理解がスムーズです。

難しい設定は一切不要です。ウィンドウを表示しておくだけで、マクロが一時停止したタイミングで変数の状態がズラッと並びます。

ローカルウィンドウで確認できること

ローカルウィンドウには3つの列があり、変数の状態をひと目で把握できます。

列名表示される内容確認できること
変数名どんな変数が宣言されているか
変数に入っている値想定どおりの値が入っているか(クリックで直接編集可。Enterで確定、Escで取消)
データ型(Integer, String など)型の不一致がないか

たとえば「数値のつもりで計算しているのに、実は文字列型だった」というバグは、型の列を見れば一発で分かります。VBAを始めたばかりの頃、この手の型ミスで何時間も悩んだ経験がある方は多いのではないでしょうか。

ローカルウィンドウが特に役立つ場面

ローカルウィンドウは、次のようなケースで威力を発揮します。

  • 変数が多いプロシージャのデバッグ: 5個以上の変数があると、Debug.Printで全部追うのは大変です
  • 配列やオブジェクトの中身確認: 展開表示で要素を1つずつ確認できます
  • 型の不一致によるエラー調査: 「型が一致しません」エラーの原因特定に最適です
  • ループ中の値の変化を追跡: ステップ実行と組み合わせて1行ずつ確認できます

ローカルウィンドウの表示方法

ローカルウィンドウはデフォルトでは非表示になっていることが多いです。表示する方法を確認しましょう。

メニューから表示する

VBE画面の上部にあるメニューバーから 「表示」→「ローカル ウィンドウ」 を選択します。VBE画面の下部にローカルウィンドウが表示されます。

ショートカットキーはある?

残念ながら、ローカルウィンドウにはデフォルトのショートカットキーが割り当てられていません。イミディエイトウィンドウCtrl + G)のように一発では開けないので、メニューから表示する方法を覚えておきましょう。

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

TIP

会社の共有PCでは、前に使った人がウィンドウのレイアウトを変えていることがあります。ローカルウィンドウが見つからないときは、画面の端に小さく畳まれていないか確認してみてください。メニューの「表示」から再表示すれば元通りになります。

ローカルウィンドウの基本的な使い方

ここからが本題です。実際にサンプルコードを使って、ローカルウィンドウの使い方を体験してみましょう。

サンプルコードで動作を確認する

まずは以下のコードをVBEの標準モジュールに貼り付けてください。

Sub LocalWindowSample()
    Dim i As Integer      '--- カウンター変数 ---
    i = 4

    Dim sCategory As String  '--- カテゴリ名 ---
    sCategory = "食べ物"

    Dim vFruits As Variant   '--- 果物リスト(配列) ---
    vFruits = Array("りんご", "いちご", "ばなな")

    Stop  '--- ここでマクロが一時停止する ---
End Sub

最後の Stop はプログラムを一時停止させるステートメントです。この行に到達した時点でマクロの実行が止まり、ローカルウィンドウに変数の状態が表示されます。

表示される内容を読み解く

ローカルウィンドウを表示した状態でこのマクロを実行(F5)すると、Stop の行で一時停止します。このとき、ローカルウィンドウには以下のような内容が表示されます。

i4Integer
sCategory食べ物String
vFruits Variant()

ウィンドウの左上には実行中のプロシージャ名が表示されます。たとえば 「VBAProject.Module1.LocalWindowSample」 のような並びです。「プロジェクト名.モジュール名.プロシージャ名」の順番で読めます。

配列の中身を展開して確認する

配列変数(上の例では vFruits)は、変数名の左に表示される 「+」マーク をクリックすると中身を展開できます。

展開すると、このように要素が1つずつ表示されます。

vFruits(0)りんごString
vFruits(1)いちごString
vFruits(2)ばななString

配列の中身を確認するのに For ループで Debug.Print を書く必要がありません。展開するだけで全要素が見えるのはとても便利ですよね。

オブジェクト変数(Range 型や Worksheet 型など)も同じように展開できます。ValueRowColumn といったプロパティが一覧で見えます。「このRangeオブジェクト、何行目を指してるんだっけ?」というときにサッと確認できますよ。

なお、モジュールレベル変数(DimPrivate でモジュール先頭に宣言した変数)は、ローカルウィンドウ先頭の展開可能なエントリの中に表示されます。

列幅の調整

環境によっては、値や型の表示が列に収まりきらず途中で切れてしまうことがあります。そんなときは、列見出しの境界線(「式」と「値」の間など)をマウスでドラッグすると列幅を調整できますよ。

ステップ実行との組み合わせが最強

ローカルウィンドウが最も威力を発揮するのは ステップ実行(F8) との組み合わせです。

ステップ実行とは

ステップ実行とは、コードを 1行ずつ 実行していくデバッグ方法です。VBEで F8 キーを押すたびに1行ずつ処理が進みます。

通常の実行(F5)ではマクロが一瞬で完了してしまうので、途中経過を確認できません。ステップ実行なら「この行を実行したら変数はどう変わるか」を1行ごとに追跡できます。

ステップ実行 + ローカルウィンドウの手順

実際の使い方を見てみましょう。以下のコードで試してみてください。

Sub StepExecutionSample()
    Dim total As Long   '--- 合計値 ---
    Dim i As Long       '--- カウンター ---

    total = 0

    For i = 1 To 5
        total = total + i * 100
    Next i

    MsgBox "合計: " & total
End Sub

手順:

  1. ローカルウィンドウを表示しておく(メニュー「表示」→「ローカル ウィンドウ」)
  2. コード内の任意の行にカーソルを置く
  3. F8 キーを押してステップ実行を開始する
  4. F8 を押すたびに1行ずつ進み、ローカルウィンドウの値がリアルタイムで更新される

値が変化した変数は赤くハイライト表示されるので、どこが変わったか一目で分かります。

ループの1周目で i = 1total = 100 に変わり、2周目で i = 2total = 300 になる。この変化の流れがローカルウィンドウに表示されるので、処理の動きが手に取るように分かります。

「ループの3周目で値がおかしくなる」といったバグも、ステップ実行 + ローカルウィンドウなら発見が簡単です。

ブレークポイントと組み合わせる

ステップ実行だと最初から1行ずつ進めることになります。「100行目あたりから確認したい」という場合は、ブレークポイント を設定しましょう。

コードの行番号の左余白をクリックするか、確認したい行にカーソルを置いて F9 を押します。ブレークポイントが設定された行は赤く強調表示されるのが目印です。

マクロを F5 で実行すると、ブレークポイントの行で自動的に一時停止します。そこからは F8 でステップ実行に切り替えて、ローカルウィンドウで変数の変化を追えます。

TIP

ブレークポイントは複数設定できます。もう一度 F9 を押すと解除されます。すべてのブレークポイントを一括解除したいときは、メニューの 「デバッグ」→「すべてのブレークポイントの解除」 を選択してください。

ローカルウィンドウの実践活用パターン

基本的な使い方がわかったところで、実務で役立つ活用パターンを紹介します。

型の不一致エラーを特定する

VBAを書いていてよく遭遇する 「実行時エラー ’13’: 型が一致しません」 というエラー。ローカルウィンドウを使えば原因の特定がスムーズです。

Sub TypeMismatchSample()
    Dim price As Long      '--- 単価 ---
    Dim quantity As Variant '--- 数量(セルから取得) ---
    Dim total As Long       '--- 合計 ---

    price = 1000
    quantity = Range("A1").Value  '--- セルの値を取得 ---

    total = price * quantity  '--- ここでエラーが出るかも ---
End Sub

セルA1に文字列(たとえば「未入力」)が入っていると、掛け算の行で型エラーが発生します。エラーが出たらローカルウィンドウを確認してみてください。

  • quantity の列に「未入力」と表示される
  • quantity の列に「String」と表示される

「数値のつもりが文字列だった」ことが一目瞭然です。原因が分かれば、If文IsNumeric を組み合わせて事前チェックを入れるなどの対策がすぐに打てますよね。

ループの途中経過をモニタリングする

ループ処理で「途中から値がおかしくなる」というケースは、ブレークポイント + ローカルウィンドウが最適です。

Sub LoopMonitorSample()
    Dim i As Long        '--- 行カウンター ---
    Dim lastRow As Long  '--- 最終行 ---
    Dim sName As String  '--- 取得した名前 ---

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        sName = Cells(i, 1).Value

        '--- 名前が空のセルがあるとここで問題が起きる ---
        Cells(i, 2).Value = Left(sName, 3)
    Next i
End Sub

ブレークポイントをループ内に設定してステップ実行すれば、i が何行目のときに sName が空になるか、ローカルウィンドウですぐに分かります。

オブジェクト変数のプロパティを一覧確認する

Range 型や Worksheet 型のオブジェクト変数も、ローカルウィンドウで展開して中身を確認できます。

Sub ObjectInspectSample()
    Dim rng As Range '--- 対象セル範囲 ---
    Set rng = Range("A1:C10")

    Stop  '--- ここで一時停止 ---
End Sub

Stop で停止した状態で、ローカルウィンドウの rng の左にある「+」をクリックしてみてください。Rows.Count(10)、Columns.Count(3)、Address($A$1:$C$10)といったプロパティが一覧で見えます。

イミディエイトウィンドウ?rng.Address のように1つずつ打ち込む方法もあります。ただ、複数のプロパティをまとめて確認したいときはローカルウィンドウのほうが効率的です。

デバッグウィンドウ3種の使い分け

VBEにはローカルウィンドウ以外にもデバッグ用のウィンドウがあります。それぞれ得意分野が異なるので、場面に応じて使い分けましょう。

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

比較項目ローカルウィンドウイミディエイトウィンドウウォッチウィンドウ
表示対象すべての変数(自動)手動で指定した値手動で指定した変数
設定の手間なし(表示するだけ)都度コマンド入力ウォッチ式の追加が必要
条件指定できないできない条件に合致したら自動停止が可能
値の変更一部可能(値の列を直接編集)自由に変更可能できない
向いている場面全変数をまとめて確認ちょい試し・値の書き換え特定の変数を条件付きで監視

場面別おすすめの使い方

使い分けに迷ったら、次の基準で選んでみてください。

  • 「全部の変数をざっと確認したい」ローカルウィンドウ。設定不要で一覧が出るので、最初に見るウィンドウとして最適です
  • 「1つの値をサッと確認したい」「コードの断片を試したい」イミディエイトウィンドウ?変数名 と打つだけでOKです
  • 「この変数が特定の値になった瞬間を捉えたい」ウォッチウィンドウ。条件付き中断機能が強力です

実際のデバッグでは、ローカルウィンドウで全体を俯瞰するのがおすすめです。怪しい変数はウォッチウィンドウに登録して重点監視すると効率的ですよ。

ローカルウィンドウのよくあるトラブルと対処法

使っていて「あれ?」となるケースをまとめました。

トラブル原因対処法
変数が何も表示されないマクロが実行中(一時停止中)でないStop文やブレークポイントで一時停止してから確認する
値が「Empty」と表示される変数に値が代入される前の行で止まっているF8 で代入行を実行してから確認する
ローカルウィンドウが見つからない非表示になっている、または画面端に畳まれているメニュー「表示」→「ローカル ウィンドウ」で再表示
文字が列に収まらず切れている列幅が狭い列見出しの境界線をドラッグして幅を広げる
長い文字列が途中までしか表示されないValue列は先頭255文字までの制限があるイミディエイトウィンドウで ?変数名 を実行して全文を確認する
配列の中身が表示されない配列が初期化されていない配列への代入後に一時停止して確認する
マクロが実行できない.xlsx 形式で保存している.xlsm(マクロ有効ブック)で保存し直す

NOTE

ローカルウィンドウの表示はマクロの実行速度にはほとんど影響しません。表示しっぱなしにしておいても問題ないので、VBAを書くときは常に表示しておくのがおすすめです。

まとめ

ローカルウィンドウは、VBAのデバッグ作業をぐっと効率化してくれる便利なツールです。

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

  • 表示方法: VBEのメニュー「表示」→「ローカル ウィンドウ」を選択
  • 自動表示: 設定不要でプロシージャ内のすべての変数を一覧表示
  • 3つの列: 「式」(変数名)・「値」(現在の値)・「型」(データ型)
  • 配列・オブジェクトの展開: 「+」マークで中身を展開して確認
  • ステップ実行(F8)との組み合わせ: 1行ずつ実行しながら値の変化を追跡
  • ブレークポイント(F9): 確認したい箇所まで一気に実行して停止

MsgBoxで1つずつ確認していた方は、ローカルウィンドウに切り替えるだけでデバッグがかなり快適になるはずです。まずはこの記事のサンプルコードをコピーして、実際に動かしてみてくださいね。

この記事で紹介したVBA関連記事

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