0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VSCode拡張機能 - ClaudeやCopilot ChatからExcel VBAを直接操作する

0
Last updated at Posted at 2026-07-26

はじめに

これまで「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段階のフローを踏む設計にしました。

  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による書換えのリスク」という点は、機能追加でなく設計の工夫でカバーした、というのが今回強調したい部分です。

セットアップ方法

本手順は、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_modulesexcel_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エージェントが「使う側」にも回れるようになりました。稚拙ですが、参考にして頂けると幸いです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?