概要
ShowCodeWindowDelayは、イミディエイトウィンドウから処理を実行したあと、VBEのコードウィンドウを前面に戻すためのExcel VBA汎用プロシージャです。
MCCErrorEscapeのようなコード生成補助では、テンプレートをクリップボードへ入れたあと、ユーザーがすぐコードウィンドウへ貼り付けられる状態にしたい場面があります。ただし、イミディエイトウィンドウから実行した直後にすぐSetFocusしても、フォーカス移動が安定しないことがあります。
そこでShowCodeWindowDelayでは、Application.OnTimeで処理タイミングを切り離し、さらにShowCodeWindow側で短く待機してからコードウィンドウを探します。
使う場面
- イミディエイトウィンドウから開発補助マクロを実行したあと、コードウィンドウへ戻したい
- コード生成結果をクリップボードへ入れたあと、貼り付け先の画面を前面にしたい
- VBIDEを操作する自作ツールで、最後に編集対象のコード画面へ戻したい
- VBEのフォーカス移動が不安定な処理に、少し待機を入れて安定させたい
使用例
単体で動きを確認する場合は、次のように呼び出します。
コードを読み込み中...実際には、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では、まずThisWorkbook.Nameで現在のブック名を取得します。Application.OnTimeで実行するプロシージャを指定するときに、ブック名!プロシージャ名の形にするためです。
Dim ProcName As String: ProcName = "ShowCodeWindow"では、あとで実行したいプロシージャ名を文字列として持っています。FullProc = BookName & "!" & ProcNameで、実行対象を組み立てています。
Application.OnTimeは、指定した時刻にマクロを実行するExcelの機能です。ここではTime_ = Now()としているため、すぐ実行する指定に近いですが、今の処理の流れから一度切り離してShowCodeWindowを呼ぶ意味があります。
ShowCodeWindowでは、TimerとDoEventsを使って約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は、イミディエイトウィンドウから実行した開発補助マクロの最後に、コードウィンドウへ戻るための小さな部品です。
単体では画面復帰だけの処理ですが、ClipTextやMCCErrorEscapeのようなコード生成・クリップボード連携と組み合わせることで、VBA開発中の「生成して貼り付ける」流れをかなり滑らかにできます。
