たとえば次のコード。実行すると存在するワークシートの名前をイミディエイトウィンドウに出力します。
Sub Sample1() Dim i As Long For i = 1 To Worksheets.Count Debug.Print Worksheets(i).Name Next i End Sub
特に難しくもありませんし、このコード自体がテーマではありません。
しかし、せっかくイミディエイトウィンドウに出力しても、かんじんのイミディエイトウィンドウが表示されていなければ、その結果を確認することはできません。もちろん、VBEの[表示]-[イミディエイトウィンドウ]を実行したり、Ctrl+Gを押せばイミディエイトウィンドウを表示できますが、何とか自動的に表示させたいです。
イミディエイトウィンドウを表示するには次のようにします。
Sub Sample2() Dim i As Long Application.VBE.Windows("イミディエイト").Visible = True For i = 1 To Worksheets.Count Debug.Print Worksheets(i).Name Next i End Sub
Visible = Trueですから、すでに表示されていれば何も変化しません。ちなみに、閉じるときはCloseメソッドを使えます。
さて、上記のように「Windows("イミディエイト").Visible = True」してやればイミディエイトウィンドウを表示することができますが、実行するとイミディエイトウィンドウにフォーカスが移動してしまいます。そのまま、イミディエイトウィンドウ上で何かの処理を続けるのでしたらいいのですが、デバッグの結果を確認してすぐコードを修正したいような場合には困ります。イミディエイトウィンドウを表示しても、コードペインにフォーカスを残すには、次のように少しだけ工夫が必要です。
Sub Sample3() Dim i As Long, CP With Application.VBE Set CP = .ActiveWindow .Windows("イミディエイト").Visible = True For i = 1 To Worksheets.Count Debug.Print Worksheets(i).Name Next i CP.SetFocus End With End Sub
VBE内のコードペインやイミディエイトウィンドウ、あるいはUserFormの設計画面などは、すべてWindowオブジェクトとして操作できます。イミディエイトウィンドウを表示するとイミディエイトウィンドウにフォーカスが移動してしまいますので、その直前にアクティブだったWindow(=マクロが書かれているコードペイン)を覚えておき、最後にSetFocusでフォーカスを移動してやります。
ただし!上記のコードはSub Sample3をVBE上で実行するという前提です。Excelのワークシート画面を表示した状態で、[マクロ]ダイアログボックスなどから上記のSample3を実行すると失敗します。VBEオブジェクトのActiveWindowプロパティを正しく取得できないからです。まぁ、このようなイミディエイトウィンドウの操作はデバッグ作業中に行うのが一般的でしょう。
VBAからVBEを操作するときは、Excelとは違う特別なオブジェクトを操作しなければなりません。けっこう奥が深い話になりますので、時間があるときにでもまとめて公開しましょう。
(追記)
マクロからVBEを操作する方法を、少しだけ書きました。マクロでVBAのソースコードを操作したり、新しいUserFormを追加したりできます。興味のある方は「VBAでVBEを操作する」をご覧ください。