1
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?

Excel VBA マクロの実装から動作確認まで AI に任せる:MDium のマクロチャット

1
Posted at

Excel のマクロ(VBA)を直したいとき、「VBE を開いてコードを読んで、直して、F5 で動かして、セルを目で確かめる」という往復を AI に丸ごと任せられたら楽です。自作の Markdown エディタ MDium に、それをやる「マクロチャット」を実装したので、実際の画面を交えて紹介します。

本記事の操作とスクリーンショットは、自作の Windows GUI 操作 MCP サーバー winuse を使って、Claude Code に MDium を実機操作させながら撮ったものです。

MDium とは

MDium は Tauri(Rust + React)製のデスクトップ Markdown エディタです。opencode / Claude Code / Codex / GitHub Copilot をひとつのパネルで切り替えられる AGENT CHAT、RAG、Office ドキュメントの変換やプレビュー、フロー(ワークフロー)エディタなどを載せています。Windows 向けのインストーラーを Releases で配布しています。

この記事で扱うのは、そのうちの Excel VBA マクロチャット です。

できること

  • .xlsm / .xlam をファイルツリーで開くと、タブが「シートプレビュー | マクロチャット」に分かれる
  • チャットに変更内容を書くだけで、AI がモジュールを展開(vba_pull)→ .bas / .cls を編集 → ブックへ書き戻し(vba_push)まで行う
  • 標準モジュール・クラスモジュールの追加と削除にも対応(ドキュメントモジュールは編集のみ)
  • 書き戻しのたびに <ブック名>.xlsm.bak を作る
  • 「動作確認までお願いします」と頼むと、AI がブックのコピー上でマクロを実行し(vba_run)、セルの値を読んで期待どおりかを自分で判断する。ずれていれば直して再実行する
  • ブックが Excel で開かれている間は書き戻しを拒否し、チャット上に警告を出す
  • 展開・書き戻しに Excel は不要(vbaProject.bin を直接読み書き)。マクロ実行だけ Windows + Excel が必要

試してみる

用意したブック

売上集計.xlsm に「売上」シート(商品名・数量・単価の 5 行)と、ヘッダー行を太字にするだけの FormatHeader マクロを入れた Module1 を用意しました。

Option Explicit

' 売上シートのヘッダー行を太字にする
Public Sub FormatHeader()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("売上")
    ws.Range("A1:C1").Font.Bold = True
End Sub

ブックを開く

MDium でフォルダを開き、ファイルツリーの 売上集計.xlsm をクリックすると、左にシートのプレビュー、右に「マクロ編集」ペインが出ます。ヘッダーにはブックのモジュール一覧(ThisWorkbook / Sheet1 / Module1)が種別つきで並びます。

xlsm を開いた直後。左にシートプレビュー、右にマクロ編集ペイン

指示を送る

右ペインの入力欄に、こう書いて送信しました。

売上シートの D 列に「金額」(数量×単価) を各行に書き、最終行の下に合計行を追加する CalcSales マクロを Module1 に追加してください。実装から動作確認までお願いします。

パスやモジュール名の指定、「展開してから」といった手順の指示は要りません。アクティブなタブがブックなので、送信文には自動でブックのパスが付きます。

AI の動き

送信直後、AI はブックのモジュール一覧を取り(vba_list)、<ブック名>_assets/macros/ に .bas / .cls を展開し(vba_pull)、シートの現在値を読みます(xlsx_read)。

vba_pull と xlsx_read を呼んでいるところ

続いて Module1.bas を編集し、vba_run で CalcSales をブックのコピー上で実行して A1:D7 を読み取ります。ファイルツリーには runs/<時刻>_<マクロ名>/ に実行用コピーができているのが見えます。

Module1.bas を編集し vba_run でコピー上で実行しているところ

完了後にツール呼び出しを展開すると、全体の流れが一列に並びます。

ツール呼び出しの一覧

  1. スキル vba-mdium-flow と vba-coding-conventions を読み込む
  2. vba_list → vba_pull → xlsx_read → read(展開したソースを読む)
  3. 編集前に vba_run で既存の FormatHeader を走らせて基準を取る(退行チェック用)
  4. edit で Module1.bas に CalcSales を追加
  5. vba_run で CalcSales を実行し、セル値を読む
  6. 期待どおりなので vba_push で原本に書き戻す

vba_run の結果には、実行後のセル値がそのまま入っています。AI はこれを「数量×単価」の期待値と突き合わせます。

vba_run の結果

vba_push の結果には、更新・追加・削除されたモジュールとバックアップのパスが入ります。今回は Module1 の更新だけです。

vba_push の結果

最後にチャットへ、追加したコードと動作確認結果がまとめて報告されます。ファイルツリーにも 売上集計.xlsm.bak が増えています。

完了報告

Excel で確かめる

書き戻されたブックを Excel で開いて Alt+F8 から CalcSales を実行すると、D 列と合計行がそのとおりに入りました。

Excel で CalcSales を実行した結果

Excel で開いたままだと

ブックを Excel で開いたまま MDium に戻ると、ペインに「Excel で開かれています。閉じてから編集してください」が出て、「マクロを取り込み」ボタンも無効になります。AI 側も vba_push が workbook_locked で拒否されるので、展開と編集は進めつつ、書き戻しだけ閉じるのを待ちます。

Excel で開いている間の警告

仕組み

opencode (LLM)
  .opencode/tools/vba_list.ts / vba_pull.ts / vba_push.ts / vba_run.ts / xlsx_read.ts
  skills/vba-mdium-flow, vba-coding-conventions   ← 接続時に MDium が自動導入
        │ HTTP (127.0.0.1, Bearer token)
        ▼
MDium (Tauri / Rust)
  /vba/list, /vba/pull, /vba/push  … vbaProject.bin を直接読み書き (MS-OVBA)
  /vba/run                         … コピーを組み立て → シム注入 → PowerShell + Excel COM(非表示)
  /xlsx/read                       … calamine で保存済みセル値を読む

展開と書き戻しは Excel なしで

pull / push は xl/vbaProject.bin(OLE 複合ファイル)を Rust で直接扱います。dir ストリームのレコードを分解してモジュールの追加・削除・差し替えを行い、/PROJECT と /PROJECTwm も合わせて更新します。ソースは MS-OVBA の圧縮形式でコードページ(日本語なら cp932)に変換して書きます。VBE のエクスポート形式(VERSION 1.0 CLASS ヘッダなど)との違いは push 側で吸収します。

実行は必ずコピー上で

vba_run は「原本 + マクロフォルダの現在のソース」からコピーを <ブック名>_assets/runs/<時刻>_<マクロ名>/ に組み立て、そこに MdiumShim という標準モジュールを注入してから Excel COM で実行します。シムは MsgBox / InputBox を横取りして、あらかじめ渡された応答を返し、未処理エラーをラッパーで捕まえます。それでも出てしまうダイアログ(実行時エラーなど)は Rust 側が Excel プロセスのウィンドウを監視して閉じます。原本には vba_push まで一切触りません。

暴走させないための制約

AI にマクロの試行錯誤を任せると、課金が膨らんだり、似た関数が増殖したり、On Error Resume Next で握りつぶして通したりしがちです。これはスキルの文面だけでなく、ツール側で抑えています。

  • vba_run は利用者の 1 回の指示につき 6 回まで。超えると run_budget_exhausted を返し、AI は状況を報告して止まる(次の指示を送ると戻る)
  • push 時の lint が duplicate_procedure(同名プロシージャの増殖)と on_error_resume_next_added を警告する
  • ファイル削除・シェル実行・通信などブックの外に影響する呼び出しが含まれていれば side_effects_detected を返し、実行するには MDium 側の承認ダイアログで利用者が許可する
  • スキルは「編集前に既存マクロの基準を取り、編集後に同じ範囲を比べて退行を検出する」「修正と再実行は 3 回まで」「期待値をコードに合わせない」と指示する

制限

  • マクロ実行(vba_run)は Windows + Microsoft Excel が必要。展開・書き戻しは OS を問わない
  • ユーザーフォーム(.frm)は展開も書き戻しも対象外。UserForm を出すマクロは自動検証できない
  • マクロチャットは opencode 接続専用(Claude Code / Codex / Copilot タブからは使えない)
  • ThisWorkbook.Path で隣のファイルを参照するマクロは、コピー上では失敗することがある(スキルに注意書きあり)

おわりに

「展開 → 編集 → コピーで実行 → セルを読んで検証 → 書き戻し」までをツールで固めると、AI にマクロを任せる心理的ハードルがかなり下がりました。手元の .xlsm で試してみたい方は MDium の Releases からどうぞ。

1
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
1
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?