はじめに:湧き上がる「VBAからCopilotを操りたい」という欲望
最近、Excelに組み込まれている Copilot、めちゃくちゃ便利になってきましたよね。

以前はリボンに配置されたボタンからの単なるチャット画面(Web版と大差なし)でしたが、最近は右下に常駐し、現在開いているブックの文脈を理解しながら、直接セルを編集してくれるまでに進化しました。

さらにM365ベースで動いているため、自作のエージェントも呼び出せるという神仕様です。

こんなに便利になってくると、わたくしとしては当然こう思うわけです。
「VBAから、このExcelに組み込まれてるCopilotと直接やり取りしたい……🫠」
しかし、普通に検索しても「Copilotを使ってVBAのコードを生成しよう!」といった記事ばかりで、「VBAでCopilotのパネル自体を自動操作する」方法はヒットしません。
少し詳しい人なら「UIAutomationを使えば?」と思うかもしれませんが、あの独特の動作の重さとシームレスさの欠如は避けたいところです。
もちろん、Office ScriptsやPower Automate、Copilot StudioによるREST APIといった「正規ルート」は存在します。
でも……違うんです。
「今開いている、このローカルのExcelのVBAから、直接あのパネルのAIと会話させたい」 のです🥺
諦めかけていたその時、ある「仕組み」に気づいたことで、完全に道が開かれました。
ヒントは「WebView2」という現代のパラダイム
最近のWindowsデスクトップアプリは、「見た目はネイティブアプリ、頭脳はWeb」という構造(ガワネイティブ)に侵食されつつあります。Windows 7の時代とは完全にパラダイムが変わりました。

この「ガワ」を提供しているのが WebView2 です。
そして、WebView2の核となるエンジンは、Google製の Chromium です。
Chromiumの自動化といえば……
そう、自動化界隈の最強の裏口 「CDP(Chrome DevTools Protocol)」 です。
最近では、AI用にそのプロトコルが扱いやすいようなツールも登場し便利さや認知が増しております。
つまり、こういう方程式が成り立ちます。
「Excelに組み込まれてるCopilot」 = 「WebView2」 = 「Chromium」 = 「CDPで完全制御可能!!🤯」
VBAからCDPを制御する手法については、IE終了時に界隈を沸かせた以下の画期的な記事をご存知の方も多いでしょう。
実装編①:WebView2のCDPポートを「安全に」こじ開ける
WebView2には、環境変数 WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS を利用して任意の追加起動引数を渡せる仕組みがあります。
つまり、この環境変数に --remote-debugging-port=9222 をセットしてあげれば、Excel内のCopilotパネルが「外部からデバッグ(制御)可能な状態」で起動します。
ただし、Windowsのシステムのプロパティから環境変数を設定してしまうと、PC全体のWebView2に影響が出てしまいセキュリティリスク大です。
そこで、Windows APIの SetEnvironmentVariableW を使い、「今起動しているExcelプロセス内でのみ有効な環境変数」としてスコープを極小化します。管理者権限も不要な、最高にスマートなハックです。
Private Declare PtrSafe Function SetEnvironmentVariableW Lib "kernel32" (ByVal lpName As LongPtr, ByVal lpValue As LongPtr) As Long 'プロセス内環境変数用API
Sub SwichingRemoteDebugging(Optional Port As Long = 9222)
Const EnvironmentName As String = "WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS"
If Port > 0 Then
SetEnvironmentVariableW StrPtr(EnvironmentName), StrPtr("--remote-debugging-port=" & Port)
Debug.Print "ExcelのWebView2へのデバッグPort:" & Port & " がOpenになりました"
Else
SetEnvironmentVariableW StrPtr(EnvironmentName), 0
Debug.Print "ExcelのWebView2へのデバッグPortがCloseになりました"
End If
End Sub
これを実行した後にCopilotボタンを押してパネルを起動すると、デバッグポートが開いた状態でCopilotが立ち上がります。
ポートの仕様上「早い者勝ち」になります。
Excel内でCopilot以外の別のWebView2機能が先に起動してしまうとポートを取られてしまうため、その場合はExcelを再起動するか、タスクマネージャーでWebView2プロセスをKillしてください。
その後のWebSocket接続などのVBA側のCDP基盤については、下記の素晴らしい記事に詳細が載っていますので、そちらをご参照ください。
実装編②:CopilotをCDPでハックする
ポートに接続できたら、目的のエージェント(M365 Copilot等)の画面まで手動で進めます。
フルコードを載せると長大になるため、ここでは「どうやってAIと対話しているのか」の核心部分(CDPのコマンドとイベント)のみを解説します。
Xpath等を駆使すれば、目的の画面までも自動制御できますがここでは説明を省きます
-
プロンプトの入力:
CDPのDOM操作機能を使い、XPath//*[@id='m365-chat-editor-target-element']に対してテキストを入力します -
送信ボタンのクリック:
XPath//*[@id='m365-chat-input-shared-wrapper']//button[@type='submit']に対してクリックイベントを発火させます -
AIからの回答を「盗み聞き」する:
ここが最大のポイントです。CDPのNetworkドメインを有効化し、Network.webSocketFrameReceivedという非同期イベントをキャッチします。これがCopilotの裏側で流れている生の受信データです -
データの抽出:
受信フレームをVBA側でパースして抽出します。処理を工夫すれば、リアルタイムでイミディエイト出力も可能です
上手くいくと、以下のように「VBAがCopilotに質問を投げ、返ってきた回答をリアルタイムでイミディエイトウィンドウに追記していく」という、夢のような自動化が完成します!
現時点でのCopilotは、最後に応答メッセージの全文を送ってくれるので、そこだけJsonパース処理して、応答テキストの抽出も可能です。
今回は普通の質問としてのDemo動画ですが、これがカスタマイズしたAIエージェントだとどうでしょうか?
決まったフォーマット(Json等)で返すように指示すれば、非常に連携力が高まるのではないでしょうか?😋

おわりに:技術の進化がもたらした「皮肉で美しい結末」
WebView2という技術が広まったからこそ、数十年前の言語である「VBA」から、最新の「Copilot(生成AI)」を、CDPという共通言語で直接コントロールできるようになりました。
もし現在のデスクトップアプリが、昔ながらの純粋な「ネイティブWindowsアプリ(C++やC#の塊)」のまま進化していたら、こんなことは到底不可能でした。座標計算や不安定なフォーカス制御に頼る「UIAutomation地獄」に陥っていたはずです。
Windows 7の時代のような「ネイティブアプリらしさ」は失われつつあります。
しかし、自動化エンジニアの目線で見れば、「CDPというWebの標準命令プロトコルさえ知っていれば、OS上のあらゆるモダンアプリをハックできてしまう時代になった」 ということです。この事実に、えも言われぬロマンを感じずにはいられません。
- VBA が、現場の泥臭い業務ロジックを制覇し
- Chromium (CDP) が、あらゆるUIのインフラとして世界を制覇し
- AI (Copilot) が、機械では不可能だった「曖昧な処理」を制覇した
この3つが、1つのExcelファイルの中で完璧に繋がる時代が来ました。
「VBAは古い」と嘆く前に、この最強のキメラ環境をぜひ皆さんも遊び尽くしてみてください!🤠


