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

VBAマネージャーをAIエージェントにしようと思ったら、結構大変なことがわかった話

1
Posted at

はじめに

ここ三回、Excelコンボという自作の道具の話を書いてきました。Excelの中に住んでいて、注文を出すと表を直してくれる、うちの忠犬です。

三本書いているうちに、あちらは自分でも「かなりいい感じに仕上がった」と言えるところまで来ました。それで、こう思ったわけです。もう一つの道具も、同じようにAIエージェントにしたらいいんじゃないか。

もう一つの道具というのは、VBAマネージャーです。こちらはPythonで書いてあって、Excelの外から中を動かします。マクロを一覧する、取り出す、直す、コンパイルする、呼び出し関係をたどる。夏のあいだ、ずっとこれで秀.xlsmという自作アドインの面倒を見てきました。

やってみたら、結構大変なことがわかりました。今日はその話です。うまくいった話より、うまくいかなかった話のほうが多い回になります。

TL;DR

  • 発端は、「この表を修正して」と打っても、AIがまったく動かなかったことです。道具が動いていたのは数秒で、残りは全部、考え込んでいた時間でした
  • 原因は道具の側にありました。VBAマネージャーはマクロの鍛冶場として育ててきたので、表を触る手が痩せていた。ダメだろうと思って見ていたら、思ったところがダメでした
  • ループを道具の側に持たせたら、一晩で動きました。ここまではいい話です
  • 動いた翌日、欠陥が出続けました。その一日でAIが自分で見つけて直したものが五十五件その中に、人に指摘されて直したものは一件もありません
  • 一番大きかったのは、元に戻すための仕掛けが、戻すたびに数式を壊していた件です。「戻せます」と名乗っていたほうが壊していました
  • 点数を聞いたら、AIは自分に65点と付けました。低いなと思って理由を聞いたら、「自分で作った問題を、自分の道具で解いて、自分で採点している」と言いました
  • そこで私のブックを一冊出しました。五本中ゼロ本でした。練習台では五十九本すべて通っていたのに、です

まず、動きませんでした

九月の頭に、こんなことがありました。

お試し版として配っているExcelコンボには、練習用のシートが何枚か入っています。そのうちの一枚は、郵便番号の書き方がばらばらで、住所に全角と半角が混じっていて、別の表と番号で突き合わせないといけない、という汚れた名簿です。

それを Claude Code に見せて、こう打ちました。

「この表を修正して」

すぐには、できませんでした。ものすごく長い時間、考え込んでしまった。表は目の前にあって、道具も揃っているのに、まったく動かない感じになりました。

ああ、やっぱりなあ、と思いました。

VBAマネージャーは、VBAを作ったり直したりするのはすごいのですが、シートそのものを作ったり直したりする側は、強化してこなかったからです。マクロの鍛冶場としては鍛えました。けれど表を触る手のほうは、ずっと最低限のままにしてありました。たぶんダメだろうと思って見ていたら、やっぱりダメでした。

あとで記録の時刻を引き算して測らせました。

合計 道具の中 考え込み
一回目 44.0秒 約5秒 約39秒
二回目(手を整えた後) 18.5秒 約5秒 約13秒

別の回では、材料を見てから最初の書き込みまで129秒かかっていました。そのあいだ、道具が使われた時間は合計1秒未満です。

つまり、遅いのは道具ではありませんでした。AIが、一手ごとにすでに決まっていることを決め直していたのです。突き合わせて見つからなかったセルは、空欄にするのか「なし」と書くのか。範囲は左上だけ指定すればいいのか、全部書くのか。この文字列は日付に化けないか。全部、道具の側に答えを持たせておけば済むことでした。

二晩かけて、その迷いを道具の側に焼かせました。材料は一回で全部出す。飛び飛びのセルは一回で書く。表の仕上げは一つの命令で終わる。文字が日付に化けたら道具が戻す。AIが決め直す余地を、道具の側から潰していく作業です。

途中で気がつきました。これはエージェントを作る作業とほとんど同じです。隣にいるAIの迷いを消す形と、道具の中に入れたAIの迷いを消す形は、同じものでした。

ちょうど Claude の Fable が 5.1 になった頃でした。その力も借りて、VBAマネージャーそのものをAIエージェントにしてみることにしました。

一晩で動きました

作らせたのは、コマンド一本です。依頼文を一つ渡すと、あとは道具がループを回します

材料を集める。AIに一回だけ聞く。返ってきた手を実行する。書いた直後の見た目を読み戻す。足りなければもう一周。終わったら検査をして、往復ごとの請求書(字数・秒・トークン)を出す。

入口は三つに分かれています。既存のシートを直す白紙から組むマクロを修理する。どれに振り分けるかは、依頼文の言葉で道具が決めます。

一晩で動きました。自動の試し撃ちを六本用意させて、六本とも合格。全部で59.6秒です。さっきの汚れた名簿は、往復二回・待ち7.9秒で片づきました。

ここで、AIから「できました」と報告が来ました。私も、できたものとして受け取りました。

早かった、というのが正確です。

道具箱にあっても、渡していなければ無い

翌日、ピボットへの対応はどうなっているのかと聞きました。

やっていませんでした。

VBAマネージャーのコマンド一覧には、テーブルもピボットもパワークエリもデータモデルも、前から揃っています。揃っているのに、AIに使わせる手として配線していなかったのです。

エージェントの中のAIは、自分に許された手のことしか知りません。道具箱に入っていても、渡していなければ無いのと同じでした。その重い道具を使ってもらえるようにしてほしい、と頼みました。

道具

重い道具を七本、その日のうちに配線させました。手は11本から18本になりました。

そして、撃たせました。ここからが本題です。

一発目、エージェントは元データの真上にピボットを置きました。 Excelが「上書きしますか」の窓を出し、そこで315秒止まりました。窓は誰も見ていないので、誰も押しません。最後に「はい」が押され、元の表が消えてピボットがエラーになりました。

原因は四つありました。「新しいシートに」の一言で入口が別のモードに振られていたこと。AIが置き場所を二通り返したときに、道具が悪いほうを採ったこと。置き場所の下に表があっても確かめずに書きにいくこと。そして、一マスだけのピボットを読むと道具の側が例外で落ちること。

四つとも直させて、二発目は往復二回・5.5秒で通りました。集計の合計が元データと一致するところまで、AIが自分で確かめて報告してきます。

「できます」の裏は、実際に撃つまで取れません。 手が配線してあっても、入口の振り分けと置き場所の既定で死ぬ、というのが分かりました。

直す前に、欠陥を全部並べさせました

次に頼んだのは、直すことではありませんでした。まだ直さなくていいので、直せる所を徹底的に探して報告してほしい。

その時点で4,048行あったエージェントの本体を、呼び先のコマンドと一行ずつ突き合わせさせました。Excelを使わずに再現できるものは、その場で撃って確かめさせました。

三十一件出ました。いくつか並べます。

  • AIが書式の指定で align:"middle" と書いた瞬間、ループごと死にます。真ん中寄せの正しい綴りではないので引数の検査に引っかかり、プロセスごと終了していました。AIから見ると、何が起きたのか分からないまま会話が終わります
  • 画像を毎往復ぶん送っていました。 書いた直後の見た目をAIに見せる仕組みを入れたのですが、過去の往復にも同じ画像がぶら下がったままで、五往復目には四枚が積まれていました
  • 承認して続きを頼む機能を二回続けて使うと、規則も、元の依頼も、材料も消えます。記録ファイルを上書きで開き直していたためです
  • 「続き」の一通目に、**「(残りの往復: 0回)」**と書いて送っていました
  • 先頭がハイフンの文字を書かせると、隣のセルに値がずれて入ることがありました

三十一件に、外への取材で足した二件を加えて三十三件。一周で直させて、テストも26本足させました。

そのあと、もう一度通しで読ませて十件。さらにもう一度で十二件。一日で五十五件です。

書いておきますが、これは自慢ではありません。五十五件は全部、AIが自分で作って、自分で見つけた欠陥です。 誰かに指摘されて直したものは、一件もありません。読み直すたびに出てくる、というのがこの一日でした。

戻すための仕掛けが、戻すたびに壊していました

五十五件の中で、一番大きかったものを書きます。

エージェントには「元に戻す」を付けてあります。最初に書き込む前にブックの控えを別ファイルとして取っておいて、気に入らなければシートの中身を控えで入れ替える、という仕組みです。

これが、戻すたびに数式を壊していました。

ブックをまたいで貼り付けると、Excelは別シートへの参照を「どのファイルの、どのシートか」の形に書き換えます。控えは別ファイルなので、こうなります。

元の数式:   ='明細'!B2
戻した後:   ='C:\…\[名簿_agent_before_….xlsx]明細'!B2

見た目の値は同じです。壊れているとは、しばらく気づきません。そして控えは五個で古いものから消えていくので、その控えが消えた瞬間に、数式が全部 #REF! になります。

実機で再現させて、直させました。貼り付けたあと、控えから読んだ数式を字面のまま入れ直す。外へのリンクが残っていたら自分のブックに差し替える。

この件で怖いのは、壊れることそのものではありません。「戻せます」と名乗っていたほうが壊していたことです。安全のために足した仕掛けが、安全でないまま、安全だと名乗っていました。

同じ性質のものが、他にもありました。白紙から組むモードには控えを取る処理が入っておらず、AIが「上書きします」と言えば既存のシートを丸ごと消せました。鍵ファイルの中身が想定と違う形だと、エージェントが一台も起動しなくなりました。最後の往復に限って、やり残しが「完了」で通っていました。

余計な直しが入っていないかを確かめました

その日の夜に、気になっていたことを確かめてもらいました。次から次へと修正が出てくるが、頼んでいない余計な直しまで一緒に入っていないか。

半日前の版と今の版の差分を取ると、825行の追加、98行の削除、89か所ありました。全部を一行ずつ読み直させました。

結果、列挙した五十五件の外側の変更は、一行もありませんでした。頼んでいない整理も、ついでの掃除も入っていません。私の疑いのほうが外れでした。

ただし、別の問題が三つ出てきました。

事故を防ぐためにAIが足した「断る」条件が、以前は通っていた頼み方まで断るようになっていたのです。

  • マクロの一部を書き換えるとき、対象モジュールの指定を一律で必須にしていた ── 候補が一つしかないときも断るようになった
  • 振り分けの語を整理したせいで、「合計を出すマクロを書いて」がシートを直すほうに落ちた
  • 数式を末尾まで伸ばす手を「先頭に値があれば断る」にしていた ── 人が書いた数式を伸ばす、という一番普通の頼み方が通らなくなった

三つとも、症状の範囲だけ断る形に戻させました。「一律で必須」「その語を外す」「値があれば断る」── この形の直しは、元の症状より広い範囲を殺します

一行でまとめると、こうです。断る向きの直しは、以前通っていた頼み方を一つ通してから出す。

点数を聞いたら、65点と言いました

ここまでで、動くものは一応できていました。それで、点数を聞いてみました。

返ってきたのは65点です。低いな、と思いました。理由はこうでした。

  • 実戦の母数が足りない。作った当日に五十五件出たということは、母数が増えれば同種がまだ出る
  • マクロを直す側の弾が四本しかない。「たぶん動く」の状態
  • 曖昧な依頼への強さが分からない。実際の注文は「いい感じにして」から始まるのに、その標本が薄い

そして、一番の理由がこれでした。「自分で作った問題を、自分の道具で解いて、自分で採点している」。

このあと、足りないと言われた分は埋まりました。終わりに関所を二つ置かせました。一つ目は道具の検査で、AIを使わないのでただです。表を実際に見て、見出しの体裁、罫線の切れ、桁区切りの有無、番号の寄せ方、列幅が足りずに出る ###、空の見出しを見る。引っかかっているうちは「完了」を受け付けません。二つ目は自己採点で、こちらはAIに一往復ぶん払います。最初の依頼文と、書いたあとの見た目の画像を並べて渡し、満たしていない点だけを挙げさせる。挙がった分は宿題として残るので、直すまで終われません。

この形は外から教わりました。九月四日の夕方、同じ問題を先に踏んでいるはずの Claude for Excel に六問だけ聞きに行かせています(このときの表示モデルは Sonnet 5 でした)。一番効いたのは、向こうはチェックリストで構造的に縛っているという答えです。こちらは規則の文章で、全部やるか、できない分は報告に書くか、と約束させていただけでした。文章の約束は破れますが、構造は破れません。

ついでに分かったこともあります。向こうには控えの仕組みがありません。 元に戻すときは、会話の履歴から直前の操作を特定して逆をやり直す形だそうです。控えを取っておくこちらのやり方は、この一点では先に行っていました。取材に行かせて、こちらの設計のほうが正しいと分かる、というのは初めてでした。

弾も増やさせました。六本から五十九本です。マクロ修理の弾は十本になって十本とも合格、曖昧な注文の弾も二本増えて二本とも合格。全部通ったときの記録(五十一本・782秒)を基準として保存してあり、次に撃って落ちた弾があれば「退行」と名前で言います。

点数は65点から70点になりました。五点しか上がりません。理由も同じでした。足した八本が全部、一発で通ってしまった。 母数は増えたが、問題を作っている側と採点している側が同じ、という構造は変わっていない ── そういう説明でした。

教習所と、路上

教習所

ここが、この記事で一番書きたいところです。

構造が変わらないなら、外から一冊入れるしかありません。それで、私がふだん使っているブックを一冊出しました。 中身は書きませんが、何年も継ぎ足しで使ってきた、人の手がさんざん入った一冊です。

複製を作らせて、三百行まで汚させました。日付の書き方を五種類混ぜ、半角カナを入れ、区分の表記を六通りにし、空行と重複と、末尾のゴミ行を足す。そして、ふだん人が口にする言い方のまま五本撃たせました。

最初の結果は、五本中ゼロ本です。

練習台では五十九本が全部通っていました。それが、本物のブックでは一本も通らなかった。出てきた欠陥を並べます。

  1. 絞り込みが掛かったままのシートに書くと、値がずれます。 そのシートは何行か隠れたままでした。隠れた行があると、範囲への書き込みは隠れた行を飛ばして下にずれます。消す処理も、隠れた行だけ消し残します
  2. 昔の絞り込みの範囲が残っていて、別の列が絞られました。 今の表の範囲を指定しているのに、Excelの内部に残っていた古い範囲で列番号が数えられていました。ある列を絞ったつもりが、まったく違う列が絞られます
  3. 絞り込みの手に、条件を渡す口がありませんでした。 既に絞り込みがあると、何もせずに終わっていました
  4. 重複を色で示す手がありませんでした。 「同じものに印を付けて」と言われて、できることが無い
  5. 三百行の表を丸ごと読んで、往復を使い切って終わりました。 読むだけで力尽きています

五つとも、練習台では一度も出ていません。 出るはずがないのです。練習台を作ったのは、道具を作っている側だからです。絞り込みを掛けっぱなしにしない。古い範囲を残さない。行を隠さない。 作る側が用意する表は、自分の道具が困らない形に、無意識で寄っていきます。

教習所のコースを引いたのは、教習所を作った側でした。そこで五十九本を完走しても、路上に出た一本目で止まります。

路上

五つとも直させて、五本中五本になりました。点数は75点です。上がった十点の根拠は「五本通ったこと」ではありません。本物のブックが欠陥を五つ吐き出して、それが直ったことです。

正直に書くと、この日に下手を打ったのは道具だけではありません。撃っている側 ── 道具を動かしているAIのほう ── も三つやりました。 三百行を一度に書こうとして途中から文字を化けさせ、絞り込みを解かずに書いて二行ずらし、そして元の行の書式を引き継がずに、様式の揃っていない練習台を作りました。人が使っている表は、行をコピーして増やしていくものです。書式を配ってから値を書く、という当たり前を、練習台の作り方のほうで外していました。

もう一つ、対象のブックの取り違えがありました。 二本目を撃つときに対象を名指ししなかったので、エージェントが複製ではなく、本物のブックのほうに書いています。書き換わったのは八件で、値は戻させ、保存はしていません。道具は「対象ブック: ○○(アクティブブック自動検出)」と名乗って動いていたので、黙って間違えたわけではありません。名乗りを読まなかった側の落ち度です。 以後は、必ずブックを名指しして撃たせることにしました。

何が大変だったのか

二日ぶんを見返すと、大変だったところは、思っていた場所と違いました。

AIを呼ぶところは、薄いのです。 材料を文にして、依頼文を添えて、返ってきたJSONを読む。ここは最初の晩に書き上がって、それから一度も直していません。

時間を食ったのは、全部その周りでした。

  • 渡す手:何をやらせるか。36本まで増えましたが、増やす以上に渡さない手を決めるほうが重要でした。行や列を消す手、名前を消す手は、いまも渡していません。戻せない手は渡さない
  • 止める関所:完了と言わせない仕組み。検査、自己採点、宿題の一覧、承認の言葉が要る操作
  • 戻す控え:控えを取る、貼り戻す、数式を壊さない、作ったピボットやテーブルを逆順で消す
  • 渡す材料:計算が手動になっていないか、シートが保護されていないか、四十行を超える表なら列ごとの性質はどうか ── AIが誤診しないための前置き

並べてみると、AI以外の全部です。前の三回では、これをしつけと呼んでいました。どこを嗅がせるか、どこで止めるか、どこで試すか ── 決めるのは飼い主のほうだ、という話です。外の道具でも、同じでした。エージェントを作る仕事は、AIに触らせるものを決める仕事です。

そしてもう一つ。作った側が用意した練習台では、作った側の欠陥は出ません。 これは道具を作る人の話であると同時に、たぶん、道具を選ぶ人の話でもあります。デモが通ることと、自分の手元のブックで通ることのあいだには、五本中ゼロ本ぶんの距離があります。

私の手応えは、まだ50点台です

道具の側は75点と言いました。私の手応えは、まだ50点台です。

足りないものは、はっきりしています。

  • 当たった本物は一冊・一シート・三百行だけです。結合セルだらけの帳票、数万行、シートの保護、他のブックへのリンク、シート名の揺れ、前任者が作った誰も中身を知らないマクロ ── 全部これからです
  • 大きい仕事が終わりません。 往復の上限が四回で、三百行の表で力尽きた件がその症状です。仕事を分割して、途中で保存して、次に再開する仕組みがありません
  • 何をしたかの明細が出ません。 変わったセルの数は数えますが、どのセルが何から何に変わったかの一覧が出ない。戻せるから大丈夫ではなく、戻さずに確かめられる必要があります
  • 中で回しているAIは一つだけです。賢いモデルにすればどこまで上がるのか、安いモデルにするとどこで壊れるのか、測っていません。いまの点数は、そのモデルの点数でもあります
  • そして一番大きいのは、私がまだ、この道具を日常の仕事で使っていないことです。母数を増やしているのは、いまも作った側の練習台のほうです

事実と見立ての仕分け

例によって仕分けます。

事実。 44.0秒/18.5秒/129秒、道具の中が約5秒(129秒の回は合計1秒未満)は、九月二日の記録の時刻を引き算した実測です。エージェントが動いたのは九月三日の夜で、最初の試し撃ちは六本中六本、59.6秒。ピボットの一発目が窓で315秒止まったこと、直した後が往復二回・5.5秒であることも実測です。

自分で見つけて直した欠陥が五十五件(三十三+十+十二)、テストが177本から282本、AIに許した手が5本から36本、自動の弾が6本から59本、本体が4,048行から5,115行というのは、今日、実物を数え直させた数字です。差分の825行追加・98行削除・89か所も、実際に取った差分の数です。

本物のブックの複製での結果(0/5 →修理→ 5/5)と、五つの欠陥の中身は、九月四日夜の実測です。控えの貼り戻しが数式を外へのリンクに書き換える件は、実機で再現させてから直させ、直った後にもう一度確かめさせています。65点・70点・75点は、道具を作っている側が自分で付けた点で、私が付けた点ではありません。

Claude for Excel の話(控えを持たない・チェックリストで縛る)は、九月四日の夕方に本人に聞いた答えで、仕様書と突き合わせたものではありません。このときの表示モデルは Sonnet 5 でした。

見立て。 「大変なのはループの外側だった」はまとめ方です。「作った側の練習台では、作った側の欠陥は出ない」も、一冊のブックで五本撃った結果からの一般化で、統計ではありません。私の手応えが50点台だというのも、数えて出した数字ではなく、使っていての感じです。

正直な線引き

  • まだ配っていません。 このエージェントの部分は、公開しているリポジトリに入っていません。説明書きも八月末で止まっています。配るかどうかは、もう少し撃ってから決めます
  • 他人のブックでは、一度も動かしていません。 本物といっても、私がふだん使っている一冊です
  • 数字は全部、手元のものです。 弾も、練習台も、採点の基準も、道具を作っている側が作りました。上に書いたとおり、それが一番の弱点です
  • エージェントの中で回しているAIは gemini-3.7-flash です。安くて速い側のもので、賢いモデルに替えれば結果は変わります。道具を作っている相棒は Claude Code のほうで、今回は Fable が 5.1 になったので、その力も借りました
  • 材料は外のAIに送られます。 シートの値も数式も、送らなければ判断できません。鍵や個人情報が載っているシートは触らせないでください。これは道具の問題ではなく、どのシートを対象にするかの問題です
  • 消す手は渡していません。 行や列を消す、名前を消す、リンクを消す ── 戻せない手は、いまも入れていません。消せるのは図形だけで、それも、ボタンとして使われている図形は道具が断ります
  • Windows 版の Excel の話です。Mac や Web では動きません

おわりに

三本続けて、Excelの中にいる犬の話を書きました。今回は、外にいるほうの道具の話です。

同じことをやればいいと思っていました。実際、AIを呼ぶところは同じでした。違ったのは、外の道具には、中の道具が最初から持っていたもの ── 表を触る手 ── が無かったことです。一晩でループが回って、二日かけて、その手が五本から三十六本まで増えました。

そして最後に、練習台では一度も出なかった欠陥を、私のブックが五つ出しました。教習所のコースを引いたのは、教習所を作った側でした。

次に撃たせるのは、こちらが作っていないブックです。

1
2
3

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