
VBAの作成や修正に生成AIを使う機会が増えてきましたね。

そうですね。でも、修正を行うときに、VBAのコードをAIにコピー&ペーストするのが面倒です。

なるほど。VBEでは、モジュールを一つずつしかエクスポートできませんからね。
プロジェクト全体をクリップボードにエクスポートするマクロを作ってみましょう。
ついでにインポートする機能も付けてしまいましょう。

お願いします。

単純なマクロなのでAIで作れると思います。
サンプルのダウンロード
このプロジェクトは、「VAサーチシリーズ(統合版)」に含まれています。Windows環境の場合は、こちらを用いたほうが簡単にインストールできます。
インストール方法
操作マニュアル
仕様
1. プロジェクト概要
VBAのコードモジュール(標準、クラス、フォーム、ドキュメント)を、生成AI(ChatGPT, Gemini, Claude等)が解釈しやすいJSON形式に変換し、クリップボード経由で一括入出力する開発支援ツール。
VBE(Visual Basic Editor)上の全コードをワンクリックでAIに渡し、AIが修正・生成したJSONコードをワンクリックでVBEに反映させる「VAシャトル」機能を実現する。
2. ファイル構成
プロジェクトは以下のモジュールで構成すること。
| モジュール名 | 種類 | 役割 |
| basMain | 標準モジュール | エントリーポイント、リボンコールバック、メニュー表示 |
| basExport | 標準モジュール | プロジェクト内の全モジュールをJSON化してクリップボードへ送る処理 |
| basImport | 標準モジュール | クリップボードのJSONを解析し、プロジェクトへ反映(置換・更新)する処理 |
| basJson | 標準モジュール | 外部ライブラリに依存しない独自のJSONパーサーおよびジェネレーター |
| basUtility | 標準モジュール | クリップボード操作、設定値(プロパティ)の保存・読込、ファイル名取得 |
| frmStartMenu | ユーザーフォーム | 操作対象のVBAプロジェクトを選択し、処理を実行するUI |
| ThisWorkbook | ThisWorkbook | 更新履歴、AIプロンプト用ガイド(コメント)、ツールの設定保存場所 |
| Sheet1 | ドキュメント | 標準のワークシート(特段のコードなし) |
3. モジュール詳細仕様
(1) ThisWorkbook
- 役割: ツール自体の管理情報と、AIに対する「プロンプト指示書」を含む。
- AIプロンプト用ガイド:
- コード内にコメントとして、AIにコード修正を依頼する際の「JSON出力ルール」を記載する。
- 必須ルール:
- 出力フォーマット:
[ {"name": "...", "type": "...", "code": "..."} ] typeの定義:Standard,Class,Form,Document- エスケープ処理: ダブルクォーテーションや改行コードの扱い。
- 出力フォーマット:
(2) basMain(標準モジュール)
- プロシージャ:
Main/ShowImportExportMenu- ユーザーフォーム
frmStartMenuを表示する。 - 実行時エラーが発生しても適切にハンドリングする。
- ユーザーフォーム
- プロシージャ:
OnRibbonButton_Click- リボンUIからの呼び出しに対応するコールバック。
(3) basExport(標準モジュール)
- 機能: 指定されたVBProject内の全コンポーネントを走査し、JSON配列文字列を生成してクリップボードにコピーする。
- 処理ロジック:
VBComponentsをループ。CodeModule.Linesでコード全体を取得。- コンポーネントタイプ(
vbext_ct_StdModule等)を文字列(Standard等)に変換。 basJson.EscapeStringでコード内容をJSONセーフな文字列に変換。- JSONオブジェクト文字列を組み立て、配列として結合。
basUtility.SetClipboardTextでクリップボードへ転送。- 完了メッセージを表示(「生成AIに貼り付けて使用してください」等)。
(4) basImport(標準モジュール)
- 機能: クリップボードからJSON文字列を取得し、解析結果に基づいてモジュールを作成・更新する。
- 処理ロジック:
basUtility.GetClipboardTextでJSONを取得。basJson.ParseJSONでCollectionオブジェクトに変換。- 各モジュール定義について
ProcessSingleModuleを実行。
- 重要機能:
ProcessSingleModule(安全な更新ロジック)- Document (Sheet/ThisWorkbook): モジュール自体は削除せず、
CodeModule.DeleteLinesとAddFromStringで中身のコードのみを書き換える(オブジェクトIDを維持するため)。 - Form: フォームのレイアウト情報(デザイナ)を保持するため、コード部分のみを書き換える。
- Standard / Class: 既存モジュールを
Removeして、新規にAddし直す(クリーンインストール)。VBEが自動挿入する「Option Explicit」等の重複に注意し、削除してからコードを書き込む。
- Document (Sheet/ThisWorkbook): モジュール自体は削除せず、
(5) basJson(標準モジュール)
- 要件:
Scripting.Dictionaryや外部DLLを使用せず、標準機能(Collection等)のみで実装されたJSONパーサー。 - 機能:
ParseJSON: JSON文字列を受け取り、Collectionのネスト構造(配列・オブジェクト)を返す。EscapeString: 文字列内の"\改行などをエスケープする。- 解析ロジック: 再帰降下パーサーを実装し、
{,[を検出してオブジェクト/配列をパースする。
(6) basUtility(標準モジュール)
- クリップボード操作:
MSForms.DataObject(CLSID:1C3B4210-F441-11CE-B9EA-00AA006B1A69) をレイトバインディングで生成し、テキストの送受信を行う。
- 設定保存:
ThisWorkbook.CustomDocumentPropertiesを使用して、「最後に選択したプロジェクト名」などの設定を保存・読み込みする。
(7) frmStartMenu(ユーザーフォーム)
- UI構成:
cboProjectList: 現在開いている編集可能なVBAプロジェクトの一覧(コンボボックス)。CommandButton1(エクスポート): 選択したプロジェクトのコードを出力。CommandButton2(インポート): クリップボードの内容を解析し、インポート候補のモジュール一覧をプレビュー表示した上で実行確認を行う。
- 動作:
- 起動時に
Application.VBE.VBProjectsを走査し、保護されていないプロジェクトをリストアップする。 - 前回使用したプロジェクトを自動選択する。
- 起動時に
4. 機能要件詳細
- AI親和性 (JSONフォーマット):
- AIが理解しやすく、かつ生成しやすいシンプルなJSON構造を採用すること。
typeプロパティにより、AIが「標準モジュール」か「シートモジュール」かを明示的に指定できるようにすること。
- 安全性 (Safe Update):
- 特に
ThisWorkbookやSheetモジュールは、誤って削除するとExcelシート自体とのリンクが切れてしまうため、絶対に削除せずコードの置換のみを行うロジックを実装すること。
- 特に
- 依存性排除:
- 配布・導入を容易にするため、その他の外部ライブラリ参照設定を必要としない(Late Bindingを使用)設計とすること。
- UI/UX:
- インポート時は、いきなり書き換えるのではなく、JSONに含まれるモジュール名の一覧を表示し、ユーザーに最終確認を求めること。
- プロジェクト名だけでなくファイル名も併記して、対象を識別しやすくすること。
5. UIデザイン
- スタートメニュー: シンプルなダイアログ。上部にプロジェクト選択プルダウン、下部に「エクスポート」「インポート」の大きなボタンを配置。
- メッセージ: 処理件数やエラー内容を明確に表示する。


コメント
「単一のテキストファイルに出力」から「それぞれのVBE形式ファイルに出力」に変更しました。
一括インポート機能を追加しました。
「制限事項」を追加しました。
プロジェクト名を設定しました。(Ver201)
AIに読み込めるファイル数の制限を超過する場合に対応できるようにするため、すべてのモジュールを統合したファイルのエクスポートおよびインポート機能を追加しました。(Ver210)
インポートおよびエクスポートファイルの文字コードをUTF-8に変更しました。(Ver240)
VBEからのエクスポート/インポート機能を追加しました。
結合ファイル名をプロジェクト名に変更しました。
インポート時のフォーム消失バグを修正しました。
モジュールを分割しました(Import/Export/Utility)。
リボンメニューに変更しました。(Ver300)
クリップボードを経由するように変更しました。(Ver400)