doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

Claude APIでExcel VBAマクロを自動生成する【コピペで動く30行】

スポンサーリンク

「毎月の集計マクロ、作りたいけどVBAの文法を思い出せない」——そんなときはClaude APIにVBAを書かせてしまうのが一番早いです。

ただし、チャット画面にコピペする運用はすぐ限界が来ます。毎回「解説は要らない」「Selectは使わないで」と注意書きを添え、返ってきたコードをコードフェンスごと選択してVBEに貼り付け、日本語コメントが文字化けする——この往復が地味に重い。

そこで、Pythonスクリプトから呼び出してそのままExcelにインポートできる .bas ファイルを吐き出させます。

Claude APIでExcel VBAマクロを自動生成する【コピペで動く30行】のサンプル ▲ 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に取り込む

  1. Excelで Alt + F11 を押してVBEを開く
  2. メニューの「ファイル」→「ファイルのインポート」
  3. 生成された Module1.bas を選択
  4. 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と組み合わせてテストする方法を扱う予定です

関連記事

あわせてチェック