Excel VBA × Claude Code で「会話するだけでフォームが作れる」開発環境を作った話
はじめに ― 40年、ずっと表計算で事務をやってきた人間の話
まず自己紹介をさせてください。
私は事務一筋で 40年働いてきた人間です。その間ずっとやってきたのは、「いかに表計算ソフトで事務仕事を楽にするか」、ただそれだけでした。Lotus 1-2-3 の時代から始まって、そのまま Excel に移って今に至ります。マクロ機能が付いた頃には飛びついて、以来 VBA で社内の伝票処理・集計・帳票出力をひたすら自動化してきました。
ただ、私はプログラマーではありません。情報系の学校を出たわけでも、業務でコードを書く部署にいたわけでもない。完全に独学でした。
その独学を支えてくれたのが、ここ Qiita です。
Range.Find の挙動でハマったとき。Application.ScreenUpdating = False を入れ忘れて画面がチカチカしたとき。Dictionary の使い方がわからなかったとき。On Error Resume Next をどう使うべきか迷ったとき。検索すると、必ず誰かが書いてくれた記事に行き着きました。コピペで動くサンプル、丁寧な解説、ハマりどころの注意書き。顔も知らない先輩エンジニアたちに何百回助けてもらったかわかりません。
ずっと「いつかこの恩を返したい」と思っていました。でも私は所詮事務員で、業務 VBA を組むのが精一杯。Qiita に書けるような「人に教えられる技術」なんて自分には無いと思っていました。
なぜ今これを書いているか
ところが去年あたりから状況が変わりました。AI コーディングツール、特に Anthropic の Claude Code が登場して、私のような事務員にも「これは本物だ」と分かるレベルのコード生成をしてくれるようになった。
最初は VBA を書かせて Excel に貼り付ける、というよくある使い方をしていました。でもだんだん欲が出てきて、「Claude が直接 .xlsm を触れたら、貼り付け作業すらいらないのでは?」と思い始めた。
そこから Claude Code と一緒に、Python(win32com)で Excel の VBA プロジェクトを外から叩く小道具を作っていきました。コードを書いていたのはほぼ全部 Claude で、私はやりたいことを言葉で伝えて、出てきた結果を試す係。気づいたら 「Claude と会話するだけでマクロが直る/フォームが作れる」開発環境ができてしまっていました。
ただの事務員が、です。
前回 Excel VBA × Claude Code で「会話するだけでマクロが直る」開発環境を作った話 で、マクロ(プロシージャ)側の話を書きました。今回はその続編で、UserForm(ダイアログ画面)も同じノリで作れるようにした話です。
長年お世話になった Qiita に、私なりの「お返し」として置かせてください。プロのエンジニアからすれば稚拙な内容かもしれませんが、同じく独学で VBA をやっている事務職の方には、何か持ち帰ってもらえるものがあるかもしれません。
TL;DR
- 独学で VBA を触ってきた事務職が、Claude Code でフォームまで自動生成できるようにした話
- VBA の UserForm エディタは、コントロールを1個ずつドラッグ&プロパティ手入力という前世紀仕様
- Python(
win32com)で UserForm の生成・コントロール配置・イベントコード注入まで全部自動化するモジュールform_builder.pyを作った - Claude Code から「ボタンを右下に追加して、押したらシートを更新するようにして」と話すだけで、配置からイベントコードまで完成する
- 結果:UserForm の修正サイクルが「分単位」から「秒単位」になった
前回までのあらすじ
前回の記事で、vba_manager.py という VBA をプロシージャ単位で読み書きする CLI を作った話を書きました。これで Claude Code が .xlsm を直接触れるようになり、「会話するだけでマクロが直る」状態になった。
これは個人的に革命でした。今まで30分かかってた修正が、口で言うだけで終わる。試行錯誤のループが圧倒的に短くなった。
ただし、残った課題が UserForm だったんです。
なぜ UserForm は鬼門だったか
VBA を触ったことがある方ならわかると思いますが、UserForm(ダイアログ画面)はソースコードだけでは完結しません。
-
.frmファイル:プロパティとコントロール定義(独自フォーマット、CP932) -
.frxファイル:バイナリリソース(画像、フォントメトリクス等)
.frm をテキストとして書き換えても .frx との整合性が崩れて壊れます。さらに:
- VBA エディタで開いた状態ではエクスポート・インポートがロックされる
- 座標は twip 単位(1pt = 20twip)で人間には扱いづらい
- イベントプロシージャ名(
btnOK_Click)はコントロール名と完全一致が必要
つまり、Claude にコードだけ書かせても画面側が手作業で残る。「ボタン1個追加したい」程度のことに毎回 VBE を立ち上げてマウスでドラッグしていたわけです。
解決策:form_builder.py
ここで Claude Code に相談したところ、「win32com で Excel を経由して VBProject を触れば、UserForm をライブで構築できる」と教えてもらいました。.frm / .frx を意識しなくていい、という発想がそもそも私には無かった。
正直に書いておくと、この記事で紹介している技術の核心部分は、私が調べて発見したのではなく Claude Code に教えてもらったものです。私がやったのは「事務員としての困りごと」を伝えて、出てきたコードを動かして、CLI として整える作業。発見の手柄は Claude 側にあります。
ここがまさに今の AI 時代の面白さで、「知識」より「困りごとを言語化する力」の方が価値を持ち始めている気がします。40年事務をやってきた人間として、これは本当に大きな変化です。
import win32com.client as win32
xl = win32.GetActiveObject("Excel.Application")
wb = xl.Workbooks("秀.xlsm")
vbproj = wb.VBProject
# UserForm を追加(3 = vbext_ct_MSForm)
form = vbproj.VBComponents.Add(3)
form.Name = "frmSample"
form.Properties("Caption").Value = "サンプルフォーム"
form.Properties("Width").Value = 300
form.Properties("Height").Value = 200
# コントロールを配置(Designer 経由)
designer = form.Designer
btn = designer.Controls.Add("Forms.CommandButton.1", "btnOK")
btn.Caption = "OK"
btn.Left, btn.Top = 200, 140
btn.Width, btn.Height = 72, 24
# イベントコードを注入
code = """\
Private Sub btnOK_Click()
MsgBox "OK が押されました"
Unload Me
End Sub
"""
form.CodeModule.AddFromString(code)
これが動いたときは、正直ちょっと震えました。40年やってきて、自分の世代の常識だと「フォームは VBE で手で組むもの」だったからです。それが Python から組み立てられる。
これを CLI 化したのが form_builder.py です(もちろん CLI 設計も実装も Claude にお願いしました。私がやったのは「こういうサブコマンドが欲しい」と要望を伝えることと、動作確認だけです)。
ツールキットは GitHub に公開しています:
https://github.com/shu1551/shu-vba-manager前回の
vba_manager.pyと今回のform_builder.pyが両方入っています。MIT ライセンスなので自由に使ってください。バグ報告・Issue ・PR 歓迎です(事務員のコードなので、お手柔らかにお願いします)。
CLI 設計
前回の vba_manager.py に合わせて、Claude 自身が叩きやすい粒度に分解してもらいました:
| サブコマンド | 役割 |
|---|---|
list-forms |
ワークブック内の UserForm 一覧 |
dump <Form> |
フォーム1枚を JSON + VBA コードに書き出し |
add-control <Form> <type> <name> |
コントロール追加(座標・サイズ・Caption もここで) |
update-control <Form> <name> --left … --caption … |
プロパティ更新 |
remove-control <Form> <name> |
コントロール削除 |
replace-event <Form> <name> <event> |
イベントプロシージャ差し替え(_last_event.vba 経由) |
ポイントは replace-event を Edit ツール非経由にしている点。これは私の方から「過去に何度も CP932 → UTF-8 の文字化けで日本語が死んできたから、この罠だけは絶対に避けたい」と Claude に伝えたら、一旦 _last_event.vba(CP932)に書き出して Python 側で読み込んで注入するという形を提案してくれました。
ここは数少ない「私の40年の事務経験が役に立った部分」かもしれません。痛い目に遭ってきた経験を Claude に伝えると、それを踏まえた設計を返してくれる。AI が万能なのではなく、人間側の経験と組み合わさって初めて強くなるのを実感した瞬間でした。
実演:話しかけるだけ
まず「こういうものが作れます」という完成品をご覧ください。この仕組みで組み上げたカレンダーフォームを紹介している動画です:
「会話だけでここまで作れるのか」というイメージを掴んでもらえれば。以下のテキストでは、もう少し簡単な「ボタンを1つ追加するだけ」の最小例で、AI とのやり取りの流れを示します:
私:frmMain にキャンセルボタンを右下に追加して、押したらフォームを閉じるようにして
Claude:(
list-forms→dump frmMain→ サイズ把握 →add-control frmMain CommandButton btnCancel --left 220 --top 240 --width 72 --height 24 --caption キャンセル→replace-eventでbtnCancel_ClickにUnload Meを注入)
追加しました。frmMain の右下にキャンセルボタンを配置し、クリックでフォームを閉じます。
所要時間:約8秒。VBE は一度も開いていません。
40年前に Lotus 1-2-3 のマクロを単純なキー形式コマンドで書いていた人間からすると、控えめに言って SF の世界です。
ハマりどころ
なおこのハマりどころも、実際に詰まったときに Claude に状況を伝えて解決策を教えてもらったものがほとんどです。
1. UserForm を開いた状態だと書き換えできない
Excel が Designer をロックします。Claude が冒頭で対象フォームを VBE で閉じる処理を入れてくれました:
for w in xl.VBE.Windows:
if w.Caption.startswith(form_name):
w.Close()
2. 座標単位
UserForm 内部は pt 単位ですが、Width / Height プロパティの単位はコントロール種別で微妙に違います。CommandButton は pt、Frame の InsideWidth は別。これも Claude が form_builder.py 側で全部 pt 統一にラップしてくれました。
3. イベントプロシージャ命名
btnOK_Click のように <コントロール名>_<イベント名> でないと紐付かない。CLI 側で組み立てる設計になっているので、Claude 自身が呼び出すときに間違えようがありません。
4. CP932 の呪い(再掲)
VBA コードを含むファイルは全部 CP932。Python 側で encoding='cp932' を徹底。Claude Code の Edit ツールを .bas / .frm に向けてはいけません(過去に何度も文字化けで死にました)。
効果
- 「ラベル1つ動かしたい」「ボタン1個増やしたい」レベルの修正が会話で完結
- VBE を開く回数が体感 1/10 に
- フォームの初期構築(10コントロール程度)が1〜2分で組み上がる
- 一度 JSON で
dumpできるので、フォームの diff が取れる(VBA UserForm の歴史的にこれが一番ありがたい)
おわりに
冒頭にも書きましたが、私はプロのエンジニアではありません。今回紹介したツールも、コードを書いたのは Claude で、私は「困っている」と伝えただけです。
それでも、AI と組んで少しの根性を出せば、自分の業務環境を自分で気持ちよくできる時代になりました。これは本当に大きい。VBA を触り始めた頃の自分に教えてあげたい。
長年 Qiita で助けてもらった分、もし同じく独学で VBA をやっている方、事務職で「自分にもできるのかな」と思っている方に、何か一つでも参考になれば嬉しいです。
リンク
- GitHub(ツールキット):https://github.com/shu1551/shu-vba-manager
- YouTube(事務改善・VBA・AI 活用の動画を上げています):https://www.youtube.com/@しゅう-v2w
動画では実際に Claude Code と会話しながらマクロを直したり、フォームを組み立てたりする様子を映しているものもあります。「文章だと動きがわからない」という方は、よかったらそちらも覗いてみてください。
次回は 秀.xlsm アドイン構造(モジュールを1つ足すだけでメニューが自動で増える仕組み)について書く予定です。これも完全に独学の産物ですが、自分なりに気に入っている設計なので紹介させてください。
最後まで読んでいただきありがとうございました。