概要
このテクニックは、Excel VBAのイミディエイトウィンドウを、簡易的なCUIとして使う発想です。
通常、VBAで新しいプロシージャを書くときは、Public Sub ...、Private Function ... As Range、引数名、引数の型、戻り値の代入行などを毎回手で入力します。入力候補が効きにくい場面もあり、短い処理を量産するときほど、細かな定型入力が積み重なります。
そこで、専用マクロMCCPを起動し、イミディエイトウィンドウ上で短い文字だけを入力していきます。たとえば、PならPublic、RならPrivate、SならSub、FならFunctionというように省略入力し、プロシージャ名、戻り値の型、引数名、引数型を順番に指定します。
最後に生成されたプロシージャコードはクリップボードへ格納されるため、コードウィンドウに戻って貼り付ければ、ひな形作成をかなり省力化できます。
使う場面
- VBAのSubやFunctionを何度も作る
Public、Private、Function、As Rangeなどの定型入力を短縮したい- プロシージャ名の接頭辞や戻り値代入行を、一定ルールでそろえたい
- 開発中だけ使う補助マクロとして、軽いコード生成ツールを作りたい
処理イメージ図
この例では、MCCPを実行してから、イミディエイトウィンドウ上でスコープ、種類、名前、戻り値、引数を入力します。生成されたコードはクリップボードに入るため、コードウィンドウへ貼り付けて続きを書けます。

操作の流れ
- VBEで
MCCPを実行する - イミディエイトウィンドウに表示された案内に従って、短い文字を入力する
ICMD1 "R"やICMD1 "Cell"のような形で入力値を渡すICMD1が入力値を受け取り、ReceiveArg_MCCPへ渡す- 必要な情報がそろったら、プロシージャコードを生成する
- 生成コードをクリップボードへ入れ、コードウィンドウに戻って貼り付ける
実際の操作イメージは次の動画で確認できます。
使用例
たとえば、Private Function Get__何かセルを参照(Cell As Range) As Rangeのようなプロシージャを作る場合、毎回すべてを手入力せず、イミディエイトウィンドウで次のような情報だけを順番に入れていきます。
スコープ: R
種類: F
プロシージャ名: 何かセルを参照
戻り値型: R
引数名1: Cell
引数型1: R
引数名2: 空欄
この入力から、次のようなひな形が生成されます。
Private Function Get__何かセルを参照(Cell As Range) As Range
'20260516
Set Get__何かセルを参照 =
End Function
戻り値がRangeやWorksheetのようなオブジェクト型の場合は、代入行にSetを付けるようにしている点も実務向けです。戻り値の型に応じて、Setが必要なものと不要なものを分けることで、貼り付け後に直す量を減らしています。
コピー可能な実装コード
下のコードは、MCCP、ICMD1、ReceiveArg_MCCP、ShowCodeWindow、コード生成用の補助関数、クリップボード格納処理を1つにまとめた貼り付け用パッケージです。
これを標準モジュールに貼り付ければ、まずMCCPを実行し、イミディエイトウィンドウ上でICMD1 "..."に入力値を入れていく流れを試せます。
このコードはScripting.DictionaryとVBIDEを使うため、VBEの「ツール」→「参照設定」で、少なくとも次の参照を有効にしてから使います。
Microsoft Scripting RuntimeMicrosoft Visual Basic for Applications Extensibility 5.3
ShowCodeWindowではApplication.VBE.Windowsを見てコードウィンドウを探し、vbext_wt_CodeWindowやvbext_ws_Maximizeでウィンドウ種類と状態を判定します。そのため、VBIDE関連の参照がないと、コードウィンドウへ戻す処理でコンパイルエラーになります。

コードを読み込み中...仕組みのポイント
MCCPは、質問を表示し、入力ステップをPri_Numで管理する本体です。最初はスコープ、次にSubかFunction、次にプロシージャ名、Functionの場合は戻り値型、次に引数名、引数型という順番で進みます。
入力を求めるたびにDebug.Printで説明文とICMD1 ""の形を出し、Set__InputArgでイミディエイトウィンドウへカーソルを移動しやすくしています。ここでSendKeysを使い、Ctrl + Gでイミディエイトウィンドウへ移動し、カーソル位置を入力しやすい場所へ戻しています。
ユーザーがICMD1 "R"のように入力すると、ICMD1が入力値をPri_Arg1へ一時保存し、Application.RunでReceiveArg_MCCPを呼び出します。ReceiveArg_MCCPは、現在のPri_Numに応じて、その入力がスコープなのか、プロシージャ種類なのか、プロシージャ名なのか、戻り値型なのか、引数名なのかを判定し、対応するPrivate変数へ格納します。これにより、イミディエイトウィンドウを「質問に答えていく入力欄」のように使えます。
引数名と引数型はScripting.Dictionaryに保持しています。複数の引数を受け付けるため、引数名1、引数型1、引数名2、引数型2という形で入力を続け、空欄が入ったところでコード生成へ進む設計です。記事掲載用の統合版では、同じ型の引数を複数指定しても重複しないように、入力順の番号をキーにして引数名と引数型を保存しています。
Conv__ValueTypeは、Rのような短い入力からRangeなどの型名を探す補助関数です。Get__DictArgTypeに登録した型名の中から部分一致で探すため、型名を毎回フル入力しなくても、短い文字で戻り値型や引数型を指定できます。
コード生成では、SubならS_またはS__、FunctionならGet_またはGet__のように接頭辞を付けています。PublicとPrivateで接頭辞を変えることで、あとからコードを読んだときに公開範囲を見分けやすくしています。
最後にClipTextで生成コードをクリップボードへコピーし、ShowCodeWindowDelayでコードウィンドウへ戻す処理を予約しています。ここではApplication.OnTimeを使い、イミディエイトウィンドウ上の処理が終わった直後にShowCodeWindowを走らせる構成にしています。
ShowCodeWindowは、VBIDEのウィンドウ一覧を調べ、最大化されているコードウィンドウを見つけてSetFocusします。これにより、イミディエイトウィンドウで対話入力したあと、生成コードを貼り付けるコードウィンドウへ戻りやすくしています。
注意点
SendKeysはアクティブウィンドウに依存します。別の画面にフォーカスが移っていると、意図しない場所へキー入力が送られる可能性があります。Dictionaryを早期バインディングで使う場合は、VBEの参照設定でMicrosoft Scripting Runtimeが必要です。参照設定を避けたい場合は、CreateObject("Scripting.Dictionary")を使う設計に変えます。ShowCodeWindowはApplication.VBE.Windowsを使うため、Microsoft Visual Basic for Applications Extensibility 5.3の参照が必要です。環境によっては、Excelのトラストセンターで「VBAプロジェクト オブジェクト モデルへのアクセスを信頼する」も確認します。- クリップボードを使うため、実行直前にコピーしていた内容は上書きされます。
- この仕組みは開発者向けの補助マクロです。一般ユーザーへ配布する業務マクロではなく、自分のVBE操作を速くするための道具として扱うのが向いています。
SendKeysや画面復帰のタイミングは環境差が出やすいため、処理が不安定な場合は、入力補助部分とコード生成部分を分けて検証します。
参考
- Microsoft Learn - SendKeys statement
- Microsoft Learn - Application.OnTime method
- Microsoft Learn - Dictionary object
- Microsoft Learn - Visual Basic Add-in Model
まとめ
イミディエイトウィンドウは、単なるデバッグ出力欄としてだけでなく、短いコマンドを入力して開発補助処理を進めるための簡易CUIとしても使えます。
今回のMCCPのように、スコープ、種類、名前、戻り値、引数だけを入力してプロシージャひな形を作れるようにしておくと、VBAの定型入力を減らせます。コード生成の範囲を「完成コード」ではなく「貼り付けてすぐ続きを書けるひな形」に絞っているため、実務開発にも取り入れやすい補助テクニックです。
