AIに書かせたVBAを後から直せる形にするには?生成の注意点を、指示2通り×各5回で数えた
前任者がいないマクロにしないために、AIが書いたVBAを次の人が直せる形にする記事です。AIでVBAを生成するときの注意点は、要件だけを渡すと、シート名とフォルダのパスがコードに直接書かれ、CSVの列も番号で決め打ちされることです。同じ要件をClaude Sonnet 5.5に5回ずつ書かせると、要件だけでは5回ともパスとシート名を2個ずつ直書きし、いちばん長い手続きは74〜129行でした。6つの決まりを足すと直書きは0個、最長は24〜32行です。マクロの守りの実験です。(2026年10月時点)
読み解きから直す・置き換えるまでの流れと費用はExcelマクロの引き継ぎのページにまとめています。
要点
- 要件だけで書かせたVBAは、5回ともフォルダのパスとシート名を2個ずつコードに直接書きました。
- 6つの決まりを指示に足すと、直書きは5回とも0個になり、列も見出しの名前で探すようになりました。
- Option Explicitとファイル操作のエラー処理は、要件だけの5回にも全部入っていました。
- 決まりつきはコードが83〜176行から239〜266行に増えるので、引き継ぐ人は設定シートから読みます。
目次
AIにVBAを書かせると、どこが後で直しにくくなりますか?
AIが書いたマクロは、書いた人(AIへの指示を出した人)が異動や退職をすると、そのまま「作った人がいないマクロ」になります。この記事は、そうなる前に、後任が直せる形に整える見方です。
直しにくくなるのは、フォルダのパスとシート名がコードの中に直接書かれ、CSVの列も番号で決め打ちされる所です。共有フォルダの名前が変わる、列が1つ増える、といった社内の変化のたびに、誰かがVBAを開いて直すことになります。
マクロの守りが同じ要件をAIに5回ずつ書かせたところ、要件だけの指示では5回ともこの3つが残りました。指示に6つの決まりを足すと、5回とも消えています。表にまとめます。引き継ぎの全体の進め方はExcelマクロの引き継ぎにあります。
| 数えたもの(5回の範囲) | 要件だけ | 決まりつき |
|---|---|---|
| パスの直書き(個) | 2 | 0 |
| シート名の直書き(個) | 2 | 0 |
| 列を見出しの名前で探す | 0回 | 5回 |
| いちばん長い手続き(行) | 74〜129 | 24〜32 |
| コード全体(行) | 83〜176 | 239〜266 |
一方で、Option Explicitとファイル操作のエラー処理は、要件だけでも5回とも入っていました。ここは差が出ていません。Option Explicitは、宣言していない変数をコンパイルの時点で止める1行です(Microsoft Learn)。AIの書くVBAで目立つ穴は、文法の作法より、社内の名前を誰がどこで変えるかの設計にありました。
実験では、何をどう比べたのですか?
同じ要件を「要件だけ」と「6つの決まりつき」の2通りでAIに渡し、5回ずつ書かせました。そのコードで、引き継ぐ人が困る書き方を数えています。AIはClaude Sonnet 5.5です。2026年10月16日の21時42分から52分に、道具も会話の履歴もない1回の応答として実行しました。
要件は、共有フォルダにある当日の受注CSVを「受注明細」シートに貼ることから始まります。続けて得意先コードごとに数量と金額を「集計」シートに合計し、PDFで保存します。決まりつきでは、要件の後ろに次の6つを足しました。
- 各モジュールの先頭にOption Explicitを書く
- シート名・フォルダのパス・ファイル名の形式は「設定」シートのセルから読む
- 列は番号で決め打ちせず、見出しの名前で探す
- ファイルを開く・保存する処理にエラー処理を入れ、どのファイルで何が起きたかを表示する
- 1つの手続きは50行以内にし、処理ごとに分ける
- 名前は何をするか分かるものにし、各手続きの先頭に1行の説明を書く
要件の文は、2通りとも同じです。
数えたのは自作のスクリプト(ai_vba_metrics.py)です。回答からコードの部分だけを取り出し、コメントを除いて数えます。パスの直書きは、円記号を含む文字列の数です。
lits = re.findall(r'"((?:[^"]|"")*)"', body) # 文字列をすべて拾う
path_literal = sum(1 for s in lits if '\\' in s and s.strip('\\'))
sheet_literal = sum(1 for s in lits if s in {'受注明細', '集計'})
ファイル操作のエラー処理は、その手続きか、呼び出し元のどれかにOn Error GoToがあれば「あり」としました。呼ばれた側にエラー処理がなければ、エラーは呼び出し元のエラー処理へ渡るためです(Microsoft Learn)。
限界もあります。コードはExcelで動かしておらず、正しく集計できるかは確かめていません。AIは1種類、要件も1つです。
決まりを足すと、何が減って何が増えましたか?
減ったのは直書きと長い手続きで、増えたのは手続きの数とコードの行数です。要件だけの5回は、手続きが1〜6個で、いちばん長いものは74〜129行でした。1回目と2回目は、手続きが1つだけです。決まりつきの5回は手続きが15〜18個に分かれ、最長でも24〜32行です。
CSVの列の読み方は、どう変わりましたか?
要件だけの5回は、CSVの列を2列目・5列目のような番号か、“B”のような列の文字で読んでいました。CSVの列が1つ増えると、止まらずに違う列を合計するおそれがあります。名前で探せば、ずれません。決まりつきの5回は、見出しの行から「得意先コード」などの名前で列を探す関数を作りました。
コードの行数とエラーの扱いは?
コードは83〜176行から239〜266行へ、2倍ほどに増えています。設定シートを読む部品と、見出しで列を探す部品が加わったからです。読む量も増えます。
On Error Resume Next(エラーを無視して次の行へ進む書き方)も、要件だけの0〜1か所から1〜3か所に増えました。中を見ると、5回とも、ブックを閉じる行とシートがあるかを確かめる行に限られていました。
指示に入れる決まりは、どう書けばよいですか?
決まりは「何を書くな」より「どこから読むか」で書くと伝わります。今回の2番目の決まりは、読み先の「設定」シートを名指ししました。AIは5回とも、その場所を使いました。設定シートの項目の表をコードの前に示し、どのセルに何を書くかも残っています。
要件の後ろに足す3つの決まりは?
私がAIにマクロを書かせるときは、要件の後ろに次の3つを必ず足します。社内で変わりうる名前(シート・フォルダ・ファイル名の形式)の置き場所、列の探し方、1つの手続きの長さの上限です。どれも1行で書けます。Option Explicitとエラー処理も書き添えますが、今回は要件だけでも入っていたので、差が出たのは前の3つでした。
AIが書き添えた補足は、どう扱いますか?
決まりつきの回答の中には、自分から「動作確認はしていません」と書いた回がありました。補足は読み飛ばしやすい所です。けれども、前提や未確認の点はそこに書かれています。社内に残すときは、その補足もコードと一緒に保存します。
AIが書いたマクロを引き継ぐ上司は、何を確かめればよいですか?
確かめるのは、名前の置き場所、いちばん長い手続き、エラーを無視する行の3つです。どれもVBEの検索で見つかります。VBAを読み慣れていなくても数えられます。
- ブックを複製し、過去の日付のCSVで1回動かして、集計とPDFを手で突き合わせる
- VBEで「\」と実際のシート名を検索し、コードに直接書かれていないかを見る
- いちばん長い手続きを探し、50行を超えていれば分け方をAIに頼み直す
- On Error Resume Nextを検索し、ブックを閉じるなど失敗しても困らない所だけかを見る
- 設定シートの項目と、変えてよい人を引き継ぎ書に書く
5番目の書き方はVBAの引き継ぎ書のひな形にあります。手続きが15個ほどになると、どこから呼ばれるかを追うのに手間がかかります。今回の決まりつきは、5回とも15個以上でした。その場合はマクロの処理を図にして読み解く方法のように、呼び出しの図を1枚作ってから読みます。
このサイトで相談するには?
AIで作り始めたマクロも、マクロの守りで、後から直せる形になっているかを一緒に見ます。何をどう頼むか決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。
準備は要りません。無料で相談するからお送りください。
よくある質問
- ChatGPTなど、ほかのAIでも同じ結果になりますか?
- 分かりません。今回はClaude Sonnet 5.5だけで、各5回です。数えるスクリプトはほかのAIの出力にも使えるので、社内で使うAIで数え直せます。
- 決まりつきで書かせたコードは、そのまま動きますか?
- 確かめていません。今回はコードを文字として数えただけで、Excelでは動かしていません。使う前に、ブックの複製と過去の日付のCSVで動かします。
- 設定シートは、誰が書き換えてよいのですか?
- フォルダやシート名が変わったときに、マクロを開かずに直すための場所です。どの項目を誰が変えてよいかを、引き継ぎ書に書いておきます。
- 1つの手続きは何行までにすればよいですか?
- 決まった基準はありません。今回は50行以内と指示し、5回とも最長24〜32行に収まりました。止まった行のまわりを1画面で読める長さを目安にします。
この記事の実験・計算の条件
Claude Sonnet 5.5(Claude Code 2.1.301、道具なし)に同じ要件を2通りの指示で各5回、計10回。2026年10月16日に実行しました。
出典
- マクロの守りの実験(2026年10月16日、Claude Sonnet 5.5 を Claude Code 2.1.301 の claude -p で道具なしに実行、同じ要件を2通りの指示で各5回)。scripts/figs/ai_vba_generate.py・ai_vba_metrics.py・ai_vba_figs.py(2026年10月16日確認)
- Microsoft Learn「Option Explicit statement (VBA)」(更新 2024-02-01)(2026年10月16日確認)
- Microsoft Learn「On Error statement (VBA)」(更新 2024-02-01)(2026年10月16日確認)