3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBAをAIに任せる。VS CodeからClaude/Copilotが直接操作する仕組み【MCP】

3
Last updated at Posted at 2026-07-26

はじめに

  • Excel VBAのコードをAIに書いてもらったことはあっても、AIが実際のExcelブックを開き、既存のVBAを確認して、解析や実行まで行うところを見たことはあるでしょうか。

  • 今回、VS Code拡張機能「excel-vba-sync」にMCPサーバー機能を追加し、ClaudeやGitHub Copilot ChatなどのAIエージェントから、ExcelのVBAプロジェクトを直接操作できるようにしました。

  • 例えば、AIに次のような依頼ができます。

    • このブックに含まれるマクロを一覧にして
    • このプロシージャの処理の流れを解析して
    • 使用しているファイル入出力やApplication.Runを調べて
    • このマクロを実行して
    • VBAコードを修正してExcelへ反映して


  • 上記はどちらも「人間が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段階のフローを踏む設計にしました。

  1. まず dryRun: true で呼び出す → 実際には書き込まず、変更差分と confirmToken が返る
  2. 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クライアントは、多くの場合この手動設定なしで自動検出されます(後述)。
  1. VS Codeのコマンドパレットから「Excel VBA: Print MCP Server Config (for AI)」を実行
  2. 出力されたJSONを、使用するAIクライアントの設定ファイルに追加します。
      Claude Code  :プロジェクトルートの .mcp.json
      Claude Desktop:claude_desktop_config.json
  3. 既存のMCP設定がある場合は、設定ファイル全体を置き換えず、mcpServers内に内容を追加してください
  4. 設定ファイルを保存し、AIクライアントを再起動します。

※VS Code内蔵のCopilot Chatは自動検出されるため、この手動設定は不要です。
※Codex(VS Code拡張機能版)など、同様の仕組みでMCPサーバーを検出するVS Code拡張機能も自動検出される可能性がありますが、未確認です。まずはツール選択画面に「vba-excel-mcp」が表示されているか確認し、表示されていなければ上記の手動設定をお試しください。

mcp1.png

実際に動かしてみる

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の流れがここに挟まる形になります。

おわりに

VBAエディタの機能不足を補うところから始まったこの拡張機能ですが、今回でAIエージェントが「使う側」にも回れるようになりました。参考にして頂けると幸いです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?