この記事では、VBA のイミディエイトウィンドウと Debug.Print (デバッグプリント)について解説します。どちらもアプリ開発になくてはならない機能なので、使い方をしっかりマスターしましょう。
【VBA】イミディエイトウィンドウ
初期設定で VBE (Visual Basic Editor) を起動すると、一番下にイミディエイトウィンドウが表示されるはずです。もしなければ、下図のようにメニューの [表示] から [イミディエイトウィンドウ] を選択します (または Ctrl + G で表示させます)。
イミディエイトウィンドウはコマンド入力画面として使用できます。先頭に「?」を付けて、式や関数を入力すると実行結果が表示されるので、手っ取り早く関数の挙動などを調べたいときに便利です。
計算式を入力します:
? 5+2*10 25
Now関数で現在の日付と時刻を表示します:
? Now() 2019/08/18 17:18:22
LCase関数で大文字を小文字に変換します:
? LCase("KOBATO") kobato
プログラムの途中で変数の状態がどうなっているのか知りたい場面は結構あります。イミディエイトウィンドウを使うと、メモリに保存されている値を表示させることができます。たとえば、次のようなコードを書いたとします。
'[VBA] Immediate Window Sample_1 Sub Increment_1() Dim x As Long, y As Long x = 10 y = 20 Stop x = x + 1 y = y + 1 End Sub
Increment_1() を実行すると、Stop ステートメントのところで処理が停止します。この段階の変数 x の値を知るには、イミディエイトウィンドウに次のように入力します。
? x 10
比較演算子を使って、変数同士の大小関係などを調べることもできます。
? x > y False
プログラムの途中に Debug.Print を記述しておけば、実行途中で変数の値を出力しつつ処理を完遂します。
'[VBA] Immediate Window Sample_2 Sub Increment_B() Dim i As Long, x As Long For i = 1 To 5 x = x + 1 Debug.Print x; Next i End Sub '1 2 3 4 5
イミディエイトウィンドウからプロシージャを実行することができます。たとえば、次のようなプロシージャを作成したとします。
'[VBA] Immediate Window Sample_3 Sub Hi() MsgBox "Hi! My name is Kobato." End Sub
イミディエイトウィンドウに Hi と入力すると、メッセージボックスが表示されます。
Hi
【VBA】Debug.Print
自分でマクロを作ってみて「動作を試したいな」てときに、MsgBox関数を使う方法もありますけど、実行するときにダイアログボックス画面が現れて、ちょっと煩わしくなることがありますね。そんなときは Debug.Print を使うと便利です。たとえば、
'[VBA] Debug.Printでイミディエイトウィンドウに文字列を表示させる Sub Display_String() Debug.Print "今日はいい天気ですね" End Sub
を実行すると、VBE画面の一番下にあるイミディエイトウィンドウに「今日はいい天気ですね」と表示されます。
これは Debugオブジェクト、つまりイミディエイトウィンドウに対して Print メソッドを使って「これを書きなさいね」と命じているわけです。すぐに実行結果を確認できるので、この機能は重宝します。できれば初級段階で覚えておきたい基本です。
Debug.Print は特に For…Next 構文などで実行する繰り返し処理を確認するときによく使われます。たとえば次のようなコードを書いてみましょう。
'[VBA] 数字を縦に並べる Sub Display_Numbers_1() Dim i As Integer For i = 1 To 3 Debug.Print i Next i End Sub
Display_Numbers_1() を実行すると
1 2 3
のように数字が縦に並んでしまいます。このマクロは数字が 3 つだからまだいいけど、10 個も 100 個も縦に並んだら見づらいことこのうえないですね。というわけで、こんなときはカウンタ変数 i の後ろにセミコロン(;)をつけてあげましょう。
'[VBA] 数字を横に並べる Sub Display_Numbers_2() Dim i As Integer For i = 1 To 3 Debug.Print i; Next i End Sub
Display_Numbers_2 を実行すると
1 2 3
というように改行せずに横並びに表示してくれます。他には i の後ろにカンマ(,)をつけるという手もあります。
'[VBA] 数字を横に並べる(間にタブを入れる) Sub Display_Numbers_3() Dim i As Integer For i = 1 To 3 Debug.Print i, Next i End Sub
Display_Numbers_3() を実行すると
「 1 2 3」のように数字の間にタブが入ります。
逆にちょっと長い文章だったりすると、むしろ途中で改行して表示したくなる場合もあります。Excel ではセルの中で改行するときに Alt + Enter と入力しますね。そのときに vbLf という改行コードが挿入されます。だからマクロでも vbLf を入れてやれば改行できます。
'[VBA] イミディエイトウィンドウに改行を含む文字列を表示(1) Sub Display_New_Line_1() Debug.Print "こばとちゃんはかわいいな"; vbCrLf; "こばとちゃんは美人だな" End Sub
Display_New_Line() を実行すると
「こばとちゃんはかわいいな
こばとちゃんは美人だな」
というように表示されます。こういう難しそうなキーワード使うと格好良いけれど、次のように書いた方が他の人が読んだときにわかりやすいかもしれません。
'VBA イミディエイトウィンドウに改行を含む文字列を表示(2) Sub Display_New_Line_2() Debug.Print "こばとちゃんはかわいいな" Debug.Print "こばとちゃんは美人だな" End Sub
格好つけるより、シンプルに書くこともプログラミングでは大切です。え? それはいいけど、表示される文章が気になる? そうですか? 「こばとちゃんはかわいい」という当たり前の事実を書いただけなんですけどね。
コメント
【ChatGPTにDegug.Printについて質問しました】
[Q] VBAのDebug.Printについて教えてください。
[ChatGPT] VBAのDebug.Printは、プログラムのデバッグや動作確認のために使用される命令です。Debug.Printを使用すると、コードの実行中に特定の値を出力できます。出力された値は、VBAの統合開発環境(IDE)のImmediateウィンドウに表示されます。Debug.Printの基本的な構文は以下の通りです。
expressionは出力したい値、式、変数、または関数です。例えば、以下のサンプルコードは、1から10までの整数を順に出力します。
上記のコードを実行すると、Immediateウィンドウに1から10までの整数が順に出力されます。Debug.Printは、変数の値や式の結果を表示するのに便利です。また、条件分岐などの分岐処理の実行時に、特定の変数の値が正しく更新されているかどうかを確認することができます。しかし、Debug.Printは、実行時にのみ有効であり、出力内容が多すぎる場合はデバッグに逆効果になることがあります。