はじめに
これまで「excel-vba-sync」というVS Code拡張機能について、以下の2本の記事を執筆してきました。
上記はどちらも「人間がVS Code上でVBAを編集する」ための機能紹介でした。
今回は AIエージェント(Claude、GitHub Copilot Chat 等)が、この拡張機能を経由してExcelのVBAコードを直接読み書き・実行可能とする アップデートを行いました。
なお、拡張機能開発の大部分をClaudeとの協働で進めました(詳細はDEVELOPMENT.md)。「AIに作ってもらった拡張機能を、今度はAIエージェントから直接使わせる」という、少し面白い流れになったので記事にしてみます。
MCPとは
Model Context Protocol(MCP)は、AIエージェントが外部のツールやデータソースに接続するための標準プロトコルです。ClaudeやCopilot Chatなどのクライアントは、MCPサーバーが公開する「ツール」を呼び出すことで、ローカル環境の操作やファイル読み書きなどを行えます。
MCPサーバーがない場合でも、AIが都度スクリプトやプログラムを生成・実行して処理を試みることはできますが、応答性や安定性はLLMの判断や生成コードの品質に左右されます。
excel-vba-syncは拡張機能本体にMCPサーバー機能を組み込み、AIエージェントからExcelのVBAプロジェクトを操作できるようにしました。
何ができるようになったか
MCPサーバーは以下7つのツールを提供します。
| ツール | できること |
|---|---|
ping |
接続確認 |
excel_list_modules |
VBAモジュール一覧の取得 |
excel_get_module_code |
モジュールのコード取得 |
excel_list_macros |
実行可能なマクロ一覧の取得 |
excel_run_macro |
マクロの実行 |
vba_search_code |
VBAコードの検索 |
excel_update_module_code |
モジュールへのコード書き込み |
これにより、たとえば「このブックのVBAコードを一通り説明して」「このプロシージャのバグを直して」といった依頼を、AIエージェントに自然言語で投げるだけで完結させられます。
結構工夫した点:書き込みの安全設計
読み取り系のツールはそれほど問題ないのですが、excel_update_module_code(コードの書き込み)は少し厄介です。AIエージェントに実ファイルを直接書き換えさせることは、リスキーな操作に含まれると思います。
そこで、書き込みは必ず2段階のフローを踏む設計にしました。
- まず
dryRun: trueで呼び出す → 実際には書き込まず、変更差分とconfirmTokenが返る - AIエージェント(または人間)がその差分を確認したうえで、同じ
confirmTokenを付けて再度呼び出す → ここで初めて実際に書き込まれる
さらに、dry-run取得後に別プロセスからモジュールが変更されていた場合は ERR_MODULE_CHANGED_SINCE_DRYRUN エラーで書き込みを拒否し、意図しない上書きを防いでいます。書き込み前には既存コードのバックアップも自動で取得されます。
実際にCopilot Chatへ「ModTestモジュールで書き込み機能の動作確認をして。元コードは保存しておいて、最後に必ず元に戻して」と指示したときの流れが以下です。
| ステップ | 内容 | 結果 |
|---|---|---|
| 1 |
excel_get_module_code で現在のコード(xxx行)を取得・保持 |
成功 |
| 2 | 末尾に ' write test <日時> をy行追加した差分で dryRun: true 実行 |
成功/confirmToken: pppppppppppppppp
|
| 3 | 同じconfirmTokenを付けて本書き込み |
成功(xxx→(xxx+y)行)/バックアップ ModTest_yyyymmdd_hhmmss.bas を自動生成 |
| 4 | 再度 excel_get_module_code で追記を確認 |
成功 |
| 5 | 元コードへ戻す差分で dryRun: true 実行 |
成功/confirmToken: qqqqqqqqqqqqqqqq(別トークンが新規発行される) |
| 6 | 同トークンで本書き込み→復元 | 成功(xxx→(xxx+y)行)/バックアップを再度自動生成 |
| 7 | 再度読み取り、元コードと一致することを確認 | 成功 |
ポイントは、書き込みのたびに毎回新しいconfirmTokenが発行される点です。差分プレビュー無しにconfirmTokenだけを使い回して書き込む、ということができない仕組みになっています。
「AIによる書換えのリスク」という点は、機能追加でなく設計の工夫でカバーした、というのが今回強調したい部分です。
セットアップ方法
本手順は、Claude Code / Claude Desktop のように、外部の設定ファイルへMCPサーバー情報を直接記述するタイプのAIクライアント向けです。VS Code拡張機能として動作し、VS Code標準のMCP連携機能を使うAIクライアントは、多くの場合この手動設定なしで自動検出されます(後述)。
- VS Codeのコマンドパレットから「Excel VBA: Print MCP Server Config (for AI)」を実行
- 出力されたJSONを、使用するAIクライアントの設定ファイルに追加します。
Claude Code :プロジェクトルートの .mcp.json
Claude Desktop:claude_desktop_config.json - 既存のMCP設定がある場合は、設定ファイル全体を置き換えず、mcpServers内に内容を追加してください
- 設定ファイルを保存し、AIクライアントを再起動します。
※VS Code内蔵のCopilot Chatは自動検出されるため、この手動設定は不要です。
※Codex(VS Code拡張機能版)など、同様の仕組みでMCPサーバーを検出するVS Code拡張機能も自動検出される可能性がありますが、未確認です。まずはツール選択画面に「vba-excel-mcp」が表示されているか確認し、表示されていなければ上記の手動設定をお試しください。
実際に動かしてみる
Excelブックを開いた状態で、Copilot Chatに自然言語で指示するだけで一通りのツールが自動で呼び出されます。実際のやり取りを抜粋します(モジュール名・マクロ名は記事用に置き換えています)。
モジュール一覧・マクロ一覧の取得
User:
sample.xlsmのモジュール一覧とマクロ一覧を作成してほしい
excel_list_modules → excel_list_macros が順に呼ばれ、以下のように整理されて返ってきます。
モジュール一覧(抜粋)
- ThisWorkbook / Sheet1 / Sheet2(標準オブジェクト)
- ModCore(.bas, 980行)/ModTest(.bas, 270行)/ModSub(.bas, 201行)
- ModMain(.bas, 283行)/ModLog(.bas, 92行)
- UserForm1 / Class1 / Module1 / Module2
マクロ一覧(実行可能Sub、30件中抜粋)
- ModTest.test_ConvertA
- ModTest.test_ValidateInput
- ModMain.ConvertButton_Click
- ModLog.AddLog
コードの中身を見る
User:
ModTestのコードが見たい
excel_get_module_code が呼ばれ、コード全文が返ります(記事では冒頭部分のみ抜粋)。
Option Explicit
Sub test_ConvertA()
Dim result As String
result = ConvertAToB("sample-input")
Debug.Print result
End Sub
Sub test_ValidateInput()
Debug.Print IsValidFormat("192.168.1.0/24") ' True
Debug.Print IsValidFormat("10.0.0.256/24") ' False
End Sub
マクロの実行
User:
ModTestモジュールのtest_ValidateInputを実行してください
excel_run_macro が呼ばれ、ok: true で正常終了したことが返ります(Debug.Printの出力内容まではツール経由では取得できないため、必要ならExcel側のイミディエイトウィンドウを確認する形になります)。
コード検索
User: "sub"という文字列検索をmax15で探してください
vba_search_code が呼ばれ、「全体xx件中、maxResults: 15で打ち切り」といった形でヒット箇所(モジュール名・行番号・該当行)が一覧で返ってきます。
書き込みが絡むケース(コードの追加・修正)については、前節で紹介したdry-run→confirmTokenの流れがここに挟まる形になります。
おわりに
- 拡張機能本体:Marketplace
- ソース・詳細ドキュメント:GitHub
VBAエディタの機能不足を補うところから始まったこの拡張機能ですが、今回でAIエージェントが「使う側」にも回れるようになりました。稚拙ですが、参考にして頂けると幸いです。
