はじめに
-
Excel VBAのコードをAIに書いてもらったことはあっても、AIが実際のExcelブックを開き、既存のVBAを確認して、解析や実行まで行うところを見たことはあるでしょうか。
-
今回、VS Code拡張機能「excel-vba-sync」にMCPサーバー機能を追加し、ClaudeやGitHub Copilot ChatなどのAIエージェントから、ExcelのVBAプロジェクトを直接操作できるようにしました。
-
例えば、AIに次のような依頼ができます。
- このブックに含まれるマクロを一覧にして
- このプロシージャの処理の流れを解析して
- 使用しているファイル入出力やApplication.Runを調べて
- このマクロを実行して
- VBAコードを修正してExcelへ反映して
- これまでにも「excel-vba-sync」について、以下の記事を書いてきました。
-
上記はどちらも「人間がVS Code上でVBAを編集する」ための機能紹介でした。
-
拡張機能開発の大部分をClaudeとの協働で進めました(詳細はDEVELOPMENT.md)。「AIに作ってもらった拡張機能を、今度はAIエージェントから直接使わせる」という、少し面白い流れになったので記事にしてみます。
対象読者
- Excel VBAの開発や保守をAIで効率化したい人
- ClaudeやCopilot ChatからExcelを操作してみたい人
- MCPサーバーの具体的な実装・活用例を知りたい人
MCPとは
-
Model Context Protocol(MCP)は、AIエージェントが外部のツールやデータソースに接続するための標準プロトコルです。ClaudeやCopilot Chatなどのクライアントは、MCPサーバーが公開する「ツール」を呼び出すことで、ローカル環境の操作やファイル読み書きなどを行えます。
-
MCPサーバーがない場合でも、AIが都度スクリプトやプログラムを生成・実行して処理を試みることはできますが、応答性や安定性はLLMの判断や生成コードの品質に左右されます。
-
excel-vba-syncは拡張機能本体にMCPサーバー機能を組み込み、AIエージェントからExcelのVBAプロジェクトを操作できるようにしました。
何ができるようになったか
- 本MCPサーバーは以下8つのツールを提供します。
| ツール | できること |
|---|---|
ping |
接続確認 |
excel_list_modules |
VBAモジュール一覧の取得 |
excel_get_module_code |
モジュールのコード取得 |
excel_list_macros |
実行可能なマクロ一覧の取得 |
excel_run_macro |
マクロの実行 |
vba_search_code |
VBAコードの検索 |
excel_update_module_code |
モジュールへのコード書き込み |
excel_read_range |
セル範囲の値の読み取り |
- これにより、例えば「このブックのVBAコードを一通り説明して」「このプロシージャのバグを直して」「このワークシートのA1:B10セルの内容を教えて」といった依頼を、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による書換えのリスク」という点は、機能追加でなく設計の工夫でカバーした、というのが今回強調したい部分になります。
追記(2026-07-27):dry-runへのlint機能とexcel_read_rangeの追加
公開後、2つの機能を追加しました。
1. dry-runにlint機能が加えました
-
excel_update_module_codeのdry-runレスポンスに、lintWarningsが追加されました。正規表現ベースの簡易チェックで(本格的なVBAパーサーではありません)、以下のような項目を検出します。-
Select/Activate/Selection/ActiveSheet/ActiveWorkbookの使用 -
Option Explicitの記述漏れ -
UsedRangeへの依存 - 裸の
Endステートメント - 200行を超える長大プロシージャ
- オブジェクト代入前の
Set漏れ(CreateObject/New/GetObject) -
PtrSafeなしのDeclare - ハードコードされたファイル番号
-
- あくまでアドバイザリー(参考情報)で、警告があっても書き込み自体はブロックされません。dry-runの差分プレビューと合わせて、「AIが書いたコードに危ういパターンが混じっていないか」を書き込み前に確認できるようになった形です。
2. excel_read_rangeツールを追加しました
-
セル範囲(例:
"A1:C10")の値をRange.Value2で読み取り、行優先の2次元配列として返す読み取り専用ツールです。 -
これまでの
excel_run_macroは「マクロが例外を投げずに完走したか」までしか確認できず、実際にセルへ意図通りの値が書き込まれたかどうかは分かりませんでした。excel_read_rangeを組み合わせることで、AIエージェントが「マクロを実行→結果をセル範囲から読み取って検証」という一連の確認まで自律的に行えるようになります。 -
なお、VBAコードを扱う他のツールと違い、こちらは通常のExcelオブジェクトモデルしか触らないため、VBAプロジェクトへのアクセスを許可するトラストセンター設定は不要です。
セットアップ方法
- 本手順は、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エージェントが「使う側」にも回れるようになりました。参考にして頂けると幸いです。
