Softex CelwareTech Blog
Excel VBA2026-06-01

イミディエイトウィンドウ実行後にコードウィンドウへ戻すExcel VBA汎用プロシージャ ShowCodeWindowDelay

イミディエイトウィンドウから開発補助マクロを実行したあと、Application.OnTimeとDoEventsでタイミングをずらしてVBEのコードウィンドウへ戻す補助プロシージャを解説します。

Excel VBA汎用プロシージャVBEVBIDEApplication.OnTime

概要

ShowCodeWindowDelayは、イミディエイトウィンドウから処理を実行したあと、VBEのコードウィンドウを前面に戻すためのExcel VBA汎用プロシージャです。

MCCErrorEscapeのようなコード生成補助では、テンプレートをクリップボードへ入れたあと、ユーザーがすぐコードウィンドウへ貼り付けられる状態にしたい場面があります。ただし、イミディエイトウィンドウから実行した直後にすぐSetFocusしても、フォーカス移動が安定しないことがあります。

そこでShowCodeWindowDelayでは、Application.OnTimeで処理タイミングを切り離し、さらにShowCodeWindow側で短く待機してからコードウィンドウを探します。

使う場面

  • イミディエイトウィンドウから開発補助マクロを実行したあと、コードウィンドウへ戻したい
  • コード生成結果をクリップボードへ入れたあと、貼り付け先の画面を前面にしたい
  • VBIDEを操作する自作ツールで、最後に編集対象のコード画面へ戻したい
  • VBEのフォーカス移動が不安定な処理に、少し待機を入れて安定させたい

使用例

単体で動きを確認する場合は、次のように呼び出します。

使用例
vba
コードを読み込み中...

実際には、MCCErrorEscapeのような処理の最後で呼び出します。

'コードウィンドウ表示
Debug.Print Str
Call ShowCodeWindowDelay

これにより、生成したテンプレートをDebug.Printで確認しつつ、コードウィンドウへ戻って貼り付ける流れを作れます。

処理の流れ

ShowCodeWindowDelay
  1. ThisWorkbook.Nameを取得する
  2. 実行対象としてShowCodeWindowを指定する
  3. ブック名!ShowCodeWindow の形式にする
  4. Application.OnTimeでShowCodeWindowの実行を予約する

ShowCodeWindow
  1. DoEventsを回しながら約0.05秒待つ
  2. Application.VBE.Windowsを順番に見る
  3. コードウィンドウかつ最大化状態のウィンドウを探す
  4. Visible = True と SetFocus で前面に出す

ポイントは、コードウィンドウを直接表示しようとせず、いったん予約実行に回している点です。イミディエイトウィンドウで処理が終わった直後の画面状態を避けることで、表示切り替えが成功しやすくなります。

MCCErrorEscapeとの関係

MCCErrorEscapeでは、エラー回避テンプレートを生成してClipTextでクリップボードへ格納したあと、最後にShowCodeWindowDelayを呼び出します。

Call ClipText(Str)
Debug.Print Str
Call ShowCodeWindowDelay

この流れにより、ユーザーはイミディエイトウィンドウでMCCErrorEscapeを実行したあと、生成されたコードを確認しつつ、コードウィンドウへ戻って貼り付けられます。

コピー可能な実装コード

ShowCodeWindowDelay.bas
vba
コードを読み込み中...

初心者向けコード解説

ShowCodeWindowDelayでは、まずThisWorkbook.Nameで現在のブック名を取得します。Application.OnTimeで実行するプロシージャを指定するときに、ブック名!プロシージャ名の形にするためです。

Dim ProcName As String: ProcName = "ShowCodeWindow"では、あとで実行したいプロシージャ名を文字列として持っています。FullProc = BookName & "!" & ProcNameで、実行対象を組み立てています。

Application.OnTimeは、指定した時刻にマクロを実行するExcelの機能です。ここではTime_ = Now()としているため、すぐ実行する指定に近いですが、今の処理の流れから一度切り離してShowCodeWindowを呼ぶ意味があります。

ShowCodeWindowでは、TimerDoEventsを使って約0.05秒だけ待っています。この短い待機により、クリップボード操作やVBE側のフォーカス移動が落ち着く余地を作っています。

Application.VBE.Windowsは、VBE内のウィンドウ一覧です。ここから、Window.Type = vbext_wt_CodeWindowかつWindow.WindowState = vbext_ws_Maximizeのウィンドウを探し、Window.SetFocusで前面に出します。

注意点

  • Application.VBE.Windowsを使うため、VBEの「ツール」→「参照設定」でMicrosoft Visual Basic for Applications Extensibility 5.3が必要になる場合があります。
  • 環境によっては、Excelのトラストセンターで「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」の確認が必要です。
  • 最大化されているコードウィンドウを対象にしているため、VBEの表示状態によっては期待したウィンドウへ戻らない場合があります。
  • 画面フォーカスを操作する補助処理なので、一般ユーザー向けの業務処理よりも、開発者向けの補助マクロとして扱うのが向いています。
  • Application.OnTimeで予約実行するため、対象ブックが閉じられている状態では正しく動きません。

関連記事

軽いまとめ

ShowCodeWindowDelayは、イミディエイトウィンドウから実行した開発補助マクロの最後に、コードウィンドウへ戻るための小さな部品です。

単体では画面復帰だけの処理ですが、ClipTextMCCErrorEscapeのようなコード生成・クリップボード連携と組み合わせることで、VBA開発中の「生成して貼り付ける」流れをかなり滑らかにできます。

この技術で業務改善しませんか?

Excel VBA・GAS・Webアプリで業務の自動化ツールを開発しています。 「こんなことできる?」というご相談だけでもお気軽にどうぞ。

無料相談はこちら →