「毎月の集計マクロ、作りたいけどVBAの文法を思い出せない」——そんなときはClaude APIにVBAを書かせてしまうのが一番早いです。
ただし、チャット画面にコピペする運用はすぐ限界が来ます。毎回「解説は要らない」「Selectは使わないで」と注意書きを添え、返ってきたコードをコードフェンスごと選択してVBEに貼り付け、日本語コメントが文字化けする——この往復が地味に重い。
そこで、Pythonスクリプトから呼び出してそのままExcelにインポートできる .bas ファイルを吐き出させます。
▲ Excel+Claude サンプル
この記事でつくるもの
コマンドラインで、やりたいことを日本語で書くだけ。
python gen_vba.py "Sheet1のA列で重複している行に色を付ける" → Module1.bas を出力しました
出てくる Module1.bas は、たとえばこんな中身になります。
Attribute VB_Name = "Module1" Option Explicit Const SHEET_NAME As String = "Sheet1" Const KEY_COL As Long = 1 Sub MarkDuplicates() Dim ws As Worksheet, lastRow As Long, i As Long Set ws = ThisWorkbook.Worksheets(SHEET_NAME) lastRow = ws.Cells(ws.Rows.Count, KEY_COL).End(xlUp).Row ' 同じ値が2件以上あれば行に色を付ける For i = 2 To lastRow ...
Option Explicit が付き、Select を使わず、シート名と列番号が冒頭の Const にまとまっている——この「行儀の良さ」を毎回自動で担保するのが、このスクリプトの本題です。
準備:APIキーとライブラリ
Anthropic Consoleでキーを発行し、環境変数に入れます。スクリプトにベタ書きするとGitHubへの流出事故が起きるので必ず環境変数で。
pip install anthropic # Windows(PowerShell / コマンドプロンプト) setx ANTHROPIC_API_KEY "sk-ant-xxxxx" # mac / Linux export ANTHROPIC_API_KEY="sk-ant-xxxxx"
setx は実行中のターミナルには反映されません。設定後は必ずターミナルを開き直してください。ここでつまずくと KeyError: 'ANTHROPIC_API_KEY' が出ます。
スクリプト本体
import os, re, sys from anthropic import Anthropic client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"]) SYSTEM = """あなたはExcel VBAの専門家です。次の制約を必ず守り、VBAコードのみを出力してください。 - 解説文やMarkdownのコードフェンスは一切付けない - 先頭に Option Explicit を書き、変数はすべて Dim で宣言する - Select / Activate は使わず、オブジェクト変数で明示的に操作する - シート名やセル範囲は冒頭に Const でまとめ、後から変更しやすくする - 処理の要点には ' で日本語コメントを入れる - コメントは全角かな・漢字と半角英数のみ。丸数字や波ダッシュなどの記号は使わない """ def generate_vba(request, module_name): res = client.messages.create( model="claude-sonnet-5", max_tokens=4000, system=SYSTEM, messages=[{"role": "user", "content": request}], ) code = res.content[0].text.strip() code = re.sub(r"^```[a-zA-Z]*\n|\n```$", "", code).strip() return f'Attribute VB_Name = "{module_name}"\n{code}\n' if __name__ == "__main__": if len(sys.argv) < 2: sys.exit('使い方: python gen_vba.py "やりたいこと" [モジュール名]') name = sys.argv[2] if len(sys.argv) > 2 else "Module1" with open(f"{name}.bas", "w", encoding="cp932", errors="replace") as f: f.write(generate_vba(sys.argv[1], name)) print(f"{name}.bas を出力しました")
30行ほどですが、実務で使うにはこれで十分です。
生成したVBAをExcelに取り込む
- Excelで
Alt + F11を押してVBEを開く - メニューの「ファイル」→「ファイルのインポート」
- 生成された
Module1.basを選択 Alt + F8でマクロ一覧を開いて実行
ファイルは「Excelマクロ有効ブック(.xlsm)」で保存してください。
なぜこう書くのか:3つのポイント
ポイント1:Attribute VB_Name でモジュール名を自分で決める
この行が無くてもインポート自体は通ります。ただしモジュール名はファイル名から自動で決まるため、生成を繰り返すと Module11, Module12 と増えたり、既存モジュールと紛らわしくなったりします。名前を自分でコントロールするための1行です。だからこそ、module_name は引数として外から渡せるようにしてあります。
ポイント2:保存は cp932
VBEはUTF-8のコメントを文字化けさせるので、Shift-JIS(cp932)で書き出します。ここで注意したいのが errors="replace" の副作用で、① や 〜 - のようなcp932にない文字が混ざると、無言で ? に置き換わります。システムプロンプトの最終行に「記号を使わない」制約を足しているのはこのためです。
ポイント3:制約はシステムプロンプトに固定する
「解説を付けるな」「Selectを使うな」は毎回のリクエスト文ではなく system に置きます。依頼側は「何をしたいか」だけに集中でき、出力も安定します。特にSelect / Activate 禁止が効き、遅くて壊れやすい初心者コードが出てこなくなります。
なお、生成コードが途中で切れていたら max_tokens の不足です。複数シート横断やエラー処理込みのマクロでは、4000 からさらに引き上げてください。
実行前に必ず確認すること
AIが書いたコードでも、VBAには「元に戻す」がありません。実行してしまえばCtrl+Zは効きません。最低限これだけは目を通してください。
Delete/ClearContents/Rows.Deleteが意図しない範囲に掛かっていないか- 冒頭の
Constのシート名・列指定が自分のブックと合っているか - ループの範囲が
Cells(Rows.Count, 1).End(xlUp).Rowなどで正しく取れているか - コメントに
?が混ざっていないか(cp932の変換漏れのサイン)
そしてテスト用にコピーしたブックで先に実行する。これを習慣にすれば事故はほぼ起きません。
モデルと費用の目安
日常的なマクロ生成なら claude-sonnet-5 が速度と精度のバランスで最適です。単純な定型処理を大量に回すなら claude-haiku-4-5-20251001 に落としてコストを下げ、複雑な業務ロジック(複数シート横断、エラー処理込み)なら claude-opus-5 に上げる、という使い分けがおすすめです。1回の生成は入出力あわせて数千トークン程度なので、個人利用の範囲なら費用はごくわずかです(最新の単価は公式の料金ページで確認を)。
まとめ
- システムプロンプトに「コードのみ・Option Explicit・Select禁止」を固定する
Attribute VB_Name付き・cp932保存で、そのままVBEにインポートできる- 生成コードは削除系の命令だけ必ず目視チェック、コピーブックで試す
このスクリプトの本当の資産はPythonコードではなく、システムプロンプトの中身です。他のツールから使う場合も、ここだけ持ち出せば同じ品質が再現できます。
あなたはExcel VBAの専門家です。次の制約を必ず守り、VBAコードのみを出力してください。 - 解説文やMarkdownのコードフェンスは一切付けない - 先頭に Option Explicit を書き、変数はすべて Dim で宣言する - Select / Activate は使わず、オブジェクト変数で明示的に操作する - シート名やセル範囲は冒頭に Const でまとめ、後から変更しやすくする - 処理の要点には ' で日本語コメントを入れる - コメントは全角かな・漢字と半角英数のみ。丸数字や波ダッシュなどの記号は使わない
VBAは「書ける人」より「読める人」のほうが圧倒的に多い技術です。書く部分をClaude APIに任せて、自分は読んで検証する側に回る——これが一番コスパの良い付き合い方だと思います。
関連記事
- ClaudeにExcel数式を聞くとき失敗する原因(同じ「AIにExcelを任せる」話の、数式版です)
- 次回は、生成したマクロをopenpyxlと組み合わせてテストする方法を扱う予定です
関連記事
- ClaudeにExcel数式を聞くとき失敗する原因|伝えるべき5項目とコピペOK定型文
- Excel Copilotが答えを外す原因はデータの形|Power Queryで月次集計を5ステップ自動化
- Excelのエラーはもう怖くない|Copilotに聞くだけで原因と直し方がわかる
- Excel Copilotで“日本語で頼むだけ”VBAマクロ自動作成|生成・解説・修正の3ステップ
- Excel Copilotでデータ整形を自動化|コピペで使える実践プロンプト集
- Excel×Claude×Power Automateで日次レポートを全自動化|5アクションで組む手順とハマりどころ5つ
- Claude×Excelで業務レポート自動作成|1時間の作業を10分にする手順とプロンプト