Gemini CLIとPowerShellでVBAerのAI活用を加速する実践ガイド
本レポートは、VBA (Visual Basic for Applications) 開発における生産性とコード品質の向上を目指すVBAerの皆様に、PowerShellとGoogleの生成AI「Gemini
CLI」を連携させた新しい開発手法を提案します。
具体的には、「Run-Gemini-On-Excel-Modules.ps1」と名付けたPowerShellスクリプトを通じて、VBAモジュールの自動抽出、生成AIへの文脈提供、そしてAIが修正・作成したコードの安全なExcelファイルへのインポートまでの一連の流れを確立します。
これにより、VBAerはレガシーコードのリファクタリング、新規関数の効率的な作成、さらにはコードレビューの支援といった領域で生成AIの強力な能力を実践的に活用できます。その結果、開発効率の大幅な向上と、より高品質なVBAアプリケーションの構築が実現できるようになります。
1. はじめに:VBA開発における生成AI活用の可能性
しかし、VBA開発者が直面する課題も少なくありません。
Geminiのような大規模言語モデルは、コードの生成、分析、リファクタリング提案など、多岐にわたるプログラミング支援能力を持っています。
2. 手法概要:PowerShellスクリプトとGemini CLIの連携
- PowerShell: Windows環境での強力な自動化とCOMオブジェクト操作
- Excel COMオブジェクト: VBAモジュールへのアクセスとインポート・エクスポート
- Gemini CLI: Googleの生成AI「Gemini」とのコマンドラインからの連携
- GEMINI.md: Gemini CLIへのプロジェクト固有の指示やコンテキストの提供
2.1. PowerShellスクリプトの処理概要フロー
- 実行モードの選択:
スクリプト開始時に、ユーザーは「新規モード」または「再開モード」を選択します。
- 新規モード: 新しいExcelファイルを選択し、すべてのプロセスを最初から実行します。
- 再開モード: 以前に作業した一時フォルダを選択し、中断した箇所(Gemini CLIでの対話から、またはSJIS変換・インポートから)を再開します。
- 新規モードの処理フロー:
- Excelファイルの選択:
ユーザーがGUIダイアログを通じて、処理対象となるマクロ有効Excelファイル(.xlsm)を選択します。 - 一時作業環境のセットアップとファイルコピー:
スクリプトが実行されたディレクトリに、タイムスタンプ付きの専用作業フォルダを作成します。
選択された元のExcelファイルを、この作業フォルダ内に「[元のファイル名]_Gemini.xlsm」という名前でコピーします。これにより、元のファイルが保護され、安全な環境でAIによる変更作業が行えます。 - VBAモジュールのエクスポートと文字コード変換:
コピーされた_Gemini.xlsmを開き、そのVBAプロジェクト内にある標準モジュール(.basファイル)を、先ほど作成した作業フォルダにエクスポートします。
エクスポートされた.basファイルは、VBAエディタのデフォルトエンコーディング(Shift-JIS)から、Geminiが最も効率的に処理できる**UTF-8(BOM付き)**に自動的に変換されます。 - GEMINI.md の自動作成:
作業フォルダ内に、Geminiへの指示やプロジェクトのコンテキストを記述したGEMINI.mdファイルを自動生成します。これには、日本語での応答指示や、VBAのリファクタリング・新規関数作成に関する具体的な要求が含まれます。このファイルは、ユーザーが手動でカスタマイズすることも可能です。
(共通処理へ続く)
- Excelファイルの選択:
- 再開モードの処理フロー:
- 一時作業フォルダの選択: ユーザーはファイル選択ダイアログに似たGUIダイアログを通じて、以前のスクリプト実行時に作成された一時作業フォルダ(例: exported_modules_20250702143000)を選択します。
- フォルダ内容の検証とExcelファイルのオープン: スクリプトは、選択されたフォルダ内に処理に必要な_Gemini.xlsm、GEMINI.md、およびエクスポートされた.basファイルが適切に存在するかを検証します。問題がなければ、そのフォルダ内の_Gemini.xlsmファイルを開きます。
- 再開ポイントの選択:
- Gemini CLIの会話モードを再開:
このオプションを選択すると、スクリプトは選択された一時フォルダ内の.basファイルをGemini CLIに読み込ませるためのコマンドをクリップボードにコピーします。
pauseでユーザーの準備を待ち、Gemini CLIを起動します。ユーザーは貼り付けたコマンドでAIとの対話を再開し、VBAコードの修正や生成を行います。
Gemini CLIでの作業が完了し、CLIを終了すると、スクリプトは自動的に次の「SJISへの再変換の選択」に進みます。 - SJIS変換とExcelへのインポートから開始:
このオプションを選択すると、Gemini CLIを起動するステップをスキップし、直接「AI処理後の.basファイルの再変換の選択」に進みます。
これは、既にGemini CLIでの対話作業が完了している、またはVBAコードを手動で修正済みで、そのファイルをExcelにインポートしたい場合に効率的です。
(共通処理へ続く)
- Gemini CLIの会話モードを再開:
- 共通処理フロー:
- AI処理後の.basファイルの再変換の選択:
Geminiとの対話が終了した(またはSJIS変換からの再開を選択した)後、スクリプトは作業フォルダ内の.basファイルをVBAエディタが読みやすいShift-JISに戻すかどうかをユーザーに確認します。 - Excelファイルへのインポートの選択:
必要に応じてShift-JISに再変換された.basファイルを、最初にコピーした_Gemini.xlsmファイルにインポートするかどうかをユーザーに確認します。
インポートを選択した場合、既存の標準モジュールは全て削除され、AIによって修正・作成された(またはそのままの)モジュールがインポートされ、ファイルが保存されます。 - 最終処理:
Excelアプリケーションを閉じ、COMオブジェクトを解放します。
スクリプト実行前の元のディレクトリに戻ります。一時作業フォルダは、手動での確認や再利用のために削除されずに残ります。
- AI処理後の.basファイルの再変換の選択:
このフローにより、VBAerはAIとの連携をスムーズに行いながら、元の開発環境を汚さずにVBAコードの改善を進めることができます。また、中断からの再開機能により、より柔軟な作業が可能となります。
2.2 PowerShellスクリプトの処理フローチャート

段階 | 処理内容 | 適用モード | 主要な操作 |
0. 実行モード選択 | 新規実行か再開かを選択 | 共通 | 新規モード:最初から開始 再開モード:既存作業フォルダから継続 |
1A. ファイル選択(新規) | 対象Excelファイルの選択 | 新規のみ | OpenFileDialogでxlsmファイル選択 元ファイルの保護 |
1B. フォルダ選択(再開) | 既存作業フォルダの選択 | 再開のみ | FolderBrowserDialogで作業フォルダ選択 必須ファイルの存在確認(_Gemini.xlsm、GEMINI.md) |
2. 準備作業 | 作業環境の構築 | 新規のみ | タイムスタンプ付き作業フォルダ作成 Excelファイルのコピー(_Gemini.xlsm) VBAモジュールのエクスポート エクスポート時:Shift-JIS → UTF-8変換 |
3. GEMINI.md作成 | AI指示ファイル生成 | 新規のみ | プロジェクト指示の記述 日本語対応設定 リファクタリング方針の明記 |
4. 再開ポイント選択 | 処理再開箇所の選択 | 再開のみ | 会話モード再開:Gemini CLI起動 SJIS変換開始:Gemini CLIスキップ |
5. Gemini CLI実行 | AI との対話セッション | 新規+再開(会話選択時) | .basファイルの読み込みコマンド生成 Gemini CLIの起動 対話的なコード改善 |
6. 文字エンコーディング復元 | Excel取り込み準備 | 共通 | UTF-8 → Shift-JIS変換 VBAエディタでの読み込み対応 |
7. インポート処理 | 改善されたコードの適用 | 共通 | 既存モジュールの削除 新しいモジュールのインポート ファイル保存 |
8. 終了処理 | リソースの解放 | 共通 | Excel COMオブジェクトの解放 元のスクリプト実行ディレクトリに復帰 |










まだまだ、なかなか安定して使えないようです。

/quit
どちらでも終了できます。



2.3 なぜPowerShellを使用するのか?VBAerのための実践的利点
- OSレベルの強力な自動化能力:
PowerShellはWindows OSに深く統合されたシェルであり、ファイルシステム操作(ファイルのコピー、ディレクトリ作成、削除)、プロセス管理(外部コマンドの実行、今回のgeminiコマンド呼び出し)、クリップボード操作など、OSレベルのタスクを非常に得意とします。これにより、VBAでは実現が困難、あるいは複雑になるような、Excelの外部にある処理(ファイルの移動、AIツールの起動など)をシームレスに自動化できます。 - COMオブジェクト連携の容易さ:
VBAと同様に、PowerShellもCOM (Component Object Model) オブジェクトを直接操作できます。これにより、Excelアプリケーション(Excel.Application)やワークブック(Excel.Workbook)をスクリプトから制御し、VBAプロジェクト(VBProject)へのアクセスやモジュールのエクスポート・インポートをVBAとほぼ同じ感覚で記述・実行することが可能です。VBAで培ったCOM操作の知識を活かしやすい点は、VBAerにとって大きなメリットです。 - 文字コード処理の柔軟性:
VBAの標準エンコーディング(Shift-JIS)と、AIが処理しやすいUTF-8(特にBOM付きUTF-8)との間で、確実かつ安全に文字コード変換を行うことができます。これは、異なるシステム間でデータを受け渡す際に発生しがちな文字化け問題を未然に防ぎ、AIの正確なコード理解を保証するために不可欠な機能です。PowerShellは多様なエンコーディングをサポートしており、この変換処理を容易に実装できます。 - 外部ツール(CLI)との連携のシンプルさ:
今回のようにGemini CLIのようなコマンドラインインターフェースを持つ外部ツールを実行し、その入出力(今回はクリップボード経由でのコマンド引き渡し)を制御することが非常に容易です。PowerShellのコマンド実行能力は、生成AIツールに限らず、Gitなどのバージョン管理システム、開発ユーティリティなど、様々なCLIツールとVBAプロジェクトを連携させるための強力な基盤となります。 - 開発環境としての利便性:
Windowsに標準搭載されており、追加のインストールなしで利用可能です。また、Visual Studio Codeなどのモダンなエディタとの統合も進んでおり、スクリプトの作成、デバッグ、実行が効率的に行えます。
2.4 本スクリプト実行のための環境構築と前提条件
詳細な手順については、同一サイト内の以下のページをご参照ください。
3. スクリプト「Run-Gemini-On-Excel-Modules.ps1」の機能詳細
3.1 実行モードの選択と初期処理
- 新規モード: 新しいExcelファイルを選択し、すべての処理をゼロから開始します。これには、ファイルコピー、VBAモジュールのエクスポートとUTF-8変換、GEMINI.mdの自動作成が含まれます。
- 再開モード: 以前に作業した一時フォルダを選択し、その中にある既存のファイル(_Gemini.xlsm、.basファイル、GEMINI.md)を読み込み、処理を途中から再開します。再開モードでは、さらに「Gemini
CLIでの対話から再開」または「SJIS変換とExcelへのインポートから開始」を選択できます。
3.2 VBAモジュールの安全な抽出とAI連携準備(新規モードのみ)
ユーザーが選択した元のExcelファイル(.xlsm)を、一時作業ディレクトリ内に「[元のファイル名]_Gemini.xlsm」として自動的にコピーします。
この「コピーして作業する」というステップは、生成AIを活用した開発において非常に重要な意味を持ちます。
- 論理的な誤り: コードの意図を誤解し、バグを導入する可能性がある。
- パフォーマンスの低下: 見た目は整っても、実行効率が落ちる場合がある。
- VBAの特定の癖や制約への非対応: 厳密なVBAの仕様や、特定のライブラリ・環境に依存する挙動を考慮できていない場合。
- 冗長なコード: 不要な処理や、最適化されていない記述が残る、あるいは生成される。
しかし、多くの生成AIモデルはUTF-8エンコーディングのテキストを最も効率的かつ正確に処理します。
スクリプトは、エクスポートされた.basファイルを自動的にUTF-8(BOM付き)に変換することで、文字化けを防ぎ、Geminiがコードの内容を正確に理解できるよう準備します。
3.3 生成AI(Gemini)への文脈提供と実行(新規モードまたは再開モードでの選択時)
これは、AIがユーザーの期待する文脈、スタイル、優先順位を理解し、より的確な応答を生成するための非常に強力な機能です。
# Gemini設定
## 言語設定
全ての応答は日本語で行ってください。
## プロジェクトの指示
以下の点について、VBAのリファクタリングおよび新規関数の作成の助けをしてください。
* 可読性の向上
* 処理速度の最適化
* 既存機能の改善提案
* 新規要件に基づく関数の設計と実装
* エラーハンドリングの強化
- AIの応答言語やトーンの指定 (## 言語設定):
「全ての応答は日本語で行ってください。」のように、Geminiがどのような言語や口調で応答すべきかを事前に設定できます。これにより、毎回プロンプトで指示する手間が省け、一貫した対話が可能です。 - プロジェクト固有のコンテキストと指示 (## プロジェクトの指示):
このセクションは、GeminiにVBAコードを分析・改善してもらう際の**具体的な「方針」や「要件」**を伝えるためのものです。
書き換え方: Run-Gemini-On-Excel-Modules.ps1を実行した後、一時ディレクトリ(例: exported_modules_20250702143000のようなフォルダ)の中にGEMINI.mdが作成されます。このファイルをメモ帳やVisual Studio Codeなどのテキストエディタで開き、## プロジェクトの指示の下の箇条書きや文章を自由に編集してください。
例えば、以下のように具体的なニーズに合わせて変更できます。
- 特定のスタイルガイドに従わせる: MsgBoxではなく、可能な限りDebug.Printを使用してください。全ての変数宣言には型を明示的に指定してください。
- 特定の関数やAPIの使用を促す/避ける: FileSystemObjectを使用する際は、エラーハンドリングを厳密に行ってください。可能な限りApplication.WorksheetFunctionを使用し、VBAでの手動計算は避けてください。
- ビジネスロジックに関する背景情報: このVBAは、経理部門の月次レポート作成を自動化するためのものです。特に、小数点の丸め処理には厳密さが必要です。
- 既知の問題や改善の方向性: 現在、処理速度が遅い箇所がいくつかあるため、パフォーマンス改善の提案を優先してください。
この「## プロジェクトの指示」セクションを詳細に記述することで、GeminiはあなたのVBA開発プロジェクトの具体的なニーズをより深く理解し、汎用的なアドバイスではなく、そのプロジェクトに最適化されたコードの提案やリファクタリングのアイデアを提供できるようになります。
これにより、AIが生成するコードの適合性と品質が飛躍的に向上します。
Geminiが特定のコードを読み込むことと、このGEMINI.mdによる指示は、車の両輪のように機能します。
具体的なコードは「何を」分析するかの対象を与え、GEMINI.mdは「どのように」分析し、改善提案すべきかの指針を与えるのです。
3.4 AI処理結果の活用とVBAプロジェクトへの反映(共通処理)
スクリプトは、Geminiとの対話終了後、ユーザーにこれらのファイルを再びShift-JISに再変換するかどうかを尋ねます。
これにより、VBAerは自身のVBA開発環境の互換性に合わせて、柔軟にエンコーディングを選択できます。
「はい」を選択した場合、スクリプトはコピー先のExcelファイルを開き、既存の標準モジュールを全て削除した上で、Geminiによって修正・作成された(またはそのままの)モジュールがインポートされ、ファイルが保存されます。
この自動インポート機能により、VBAerは手動でファイルを一つずつインポートする手間を省き、迅速にAIの提案をVBAプロジェクトに反映させることができます。
本スクリプトを使用する際は、事前にパスワードを解除しておく必要があります。将来的な機能拡張として、この課題への対応も検討されます。
4. スクリプト本体とコード解説
これにより、VBAerの皆様はスクリプトの動作原理を深く理解し、自身のニーズに合わせてカスタマイズすることも可能になります。
# Run-Gemini-On-Excel-Modules.ps1
# グローバル変数の初期化(スクリプト全体で利用)
$excel = $null
$workbook = $null
$exportDir = $null
$copiedXlsmFilePath = $null
$copiedXlsmFileName = $null
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path # スクリプト実行ディレクトリを常に保持
# 処理を続行すべきかどうかのフラグ
$continueProcessing = $true
# Gemini CLIの起動をスキップするかどうかのフラグ(再開モードでSJIS変換から開始する場合に利用)
$skipGeminiCliLaunch = $false
#--------------------------------------------------------------------
# 0. 実行モードの選択
#--------------------------------------------------------------------
Write-Host "実行モードを選択してください:" -ForegroundColor Yellow
Write-Host " 1. 新規モード (新しいExcelファイルを選択し、最初から処理を開始)" -ForegroundColor Cyan
Write-Host " 2. 再開モード (既存の一時作業フォルダから処理を再開)" -ForegroundColor Cyan
$modeChoice = Read-Host "選択 (1 または 2)"
if ($modeChoice -eq "2") {
# 再開モードの場合の処理
Add-Type -AssemblyName System.Windows.Forms
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$folderBrowser.Description = "再開する一時作業フォルダを選択してください"
if ($folderBrowser.ShowDialog() -ne "OK") {
Write-Host "フォルダ選択がキャンセルされました。処理を中断します。"
$continueProcessing = $false
}
else {
$exportDir = $folderBrowser.SelectedPath
Write-Host "選択された一時作業フォルダ: '$exportDir'" -ForegroundColor Green
# 必須ファイルの存在チェック
# _Gemini.xlsm は必須
$copiedXlsmFileInExportDir = Get-ChildItem -Path $exportDir -Filter "*_Gemini.xlsm" -ErrorAction SilentlyContinue | Select-Object -First 1
# GEMINI.md は必須
$geminiMdFileInExportDir = Get-ChildItem -Path $exportDir -Filter "GEMINI.md" -ErrorAction SilentlyContinue | Select-Object -First 1
# .bas ファイルはAIとの対話後に生成される可能性もあるため、必須ではないが、存在しない場合は警告を出す
$basFilesInExportDir = Get-ChildItem -Path $exportDir -Filter "*.bas" -ErrorAction SilentlyContinue
if (-not $copiedXlsmFileInExportDir) {
Write-Error "エラー: 選択されたフォルダに '_Gemini.xlsm' ファイルが見つかりません。有効な一時作業フォルダではありません。"
$continueProcessing = $false
}
if (-not $geminiMdFileInExportDir) {
Write-Error "エラー: 選択されたフォルダに 'GEMINI.md' ファイルが見つかりません。有効な一時作業フォルダではありません。"
$continueProcessing = $false
}
if (-not $basFilesInExportDir) {
Write-Host "警告: 選択されたフォルダに .bas ファイルが見つかりませんでした。Gemini CLIとの対話は可能ですが、インポート処理は行えません。" -ForegroundColor Yellow
}
if ($continueProcessing) {
# 各種変数を設定して、後続の処理で再利用できるようにする
$copiedXlsmFilePath = $copiedXlsmFileInExportDir.FullName
# 例: MyWorkbook_Gemini.xlsm -> MyWorkbook
$originalFileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($copiedXlsmFileInExportDir.Name) -replace '_Gemini$',''
$copiedXlsmFileName = $copiedXlsmFileInExportDir.Name
# ExcelアプリケーションをCOMオブジェクトとして起動し、ワークブックを開く
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
try {
$workbook = $excel.Workbooks.Open($copiedXlsmFilePath)
} catch {
Write-Error "エラー: Excelファイルのオープン中にエラーが発生しました: $($_.Exception.Message)"
$continueProcessing = $false
}
}
}
# 再開ポイントの選択
if ($continueProcessing) { # Excelオープンまで成功した場合のみ再開ポイントを選択
Write-Host "再開する処理を選択してください:" -ForegroundColor Yellow
Write-Host " 1. Gemini CLIの会話モードを再開 (VBAコードをGeminiに再度読み込ませて対話)" -ForegroundColor Cyan
Write-Host " 2. SJIS変換とExcelへのインポートから開始 (Geminiでの作業は完了済みの場合)" -ForegroundColor Cyan
$resumeChoice = Read-Host "選択 (1 または 2)"
if ($resumeChoice -eq "1") {
# この場合、Gemini CLIを起動するためのパスを通す
# 以下の「4. Gemini CLIの起動準備と実行」セクションへ進む
}
elseif ($resumeChoice -eq "2") {
# Gemini CLIの起動をスキップし、直接SJIS変換とインポートへ進む
Write-Host "SJIS変換とExcelへのインポート処理に進みます。" -ForegroundColor Green
# Gemini CLI起動セクションをスキップするためのフラグを設定
$skipGeminiCliLaunch = $true
}
else {
Write-Host "無効な選択です。処理を中断します。"
$continueProcessing = $false
}
}
}
elseif ($modeChoice -eq "1") {
# 新規モードの場合
Write-Host "新規モードで処理を開始します。" -ForegroundColor Green
$skipGeminiCliLaunch = $false # 新規モードではGemini CLIを起動する
#--------------------------------------------------------------------
# 1. ファイル選択ダイアログの表示
#--------------------------------------------------------------------
# ユーザーが処理対象のExcelファイルを選択するためのダイアログを表示します。
# 選択されたファイルのパスは $originalXlsmFilePath に格納されます。
Add-Type -AssemblyName System.Windows.Forms
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.Title = "モジュールを処理するExcelファイルを選択"
$dialog.Filter = "マクロ有効Excelファイル (*.xlsm)|*.xlsm"
if ($dialog.ShowDialog() -ne "OK") {
Write-Host "ファイル選択がキャンセルされました。処理を中断します。"
$continueProcessing = $false
}
else {
$originalXlsmFilePath = $dialog.FileName # 元のファイルのパスを保持
#--------------------------------------------------------------------
# 2. モジュールのエクスポートとUTF-8変換のための準備
#--------------------------------------------------------------------
# スクリプトの実行ディレクトリに、タイムスタンプ付きの一時作業ディレクトリを作成します。
# このディレクトリ内で全ての処理が行われます。
$exportDir = Join-Path $scriptDir "exported_modules_$(Get-Date -Format 'yyyyMMddHHmmss')"
New-Item -ItemType Directory -Path $exportDir | Out-Null
# 選択された元のExcelファイルを、作成した一時作業ディレクトリ内にコピーします。
# これにより、元のファイルはAIによる変更から保護されます。
$originalFileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($originalXlsmFilePath)
$copiedXlsmFileName = "$($originalFileNameWithoutExtension)_Gemini.xlsm"
$copiedXlsmFilePath = Join-Path $exportDir $copiedXlsmFileName
try {
Copy-Item -Path $originalXlsmFilePath -Destination $copiedXlsmFilePath -Force
Write-Host "元のExcelファイル '$($originalXlsmFilePath)' を '$($copiedXlsmFilePath)' にコピーしました。" -ForegroundColor Green
}catch {
Write-Error "エラー: Excelファイルのコピー中にエラーが発生しました: $($_.Exception.Message)"
$continueProcessing = $false
}
if ($continueProcessing) {
# ExcelアプリケーションをCOMオブジェクトとして起動します。
# バックグラウンドで処理を行うため、Visible を $false に設定します。
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
try {
# コピーしたExcelファイルを開きます。
$workbook = $excel.Workbooks.Open($copiedXlsmFilePath)
# VBAプロジェクト内の標準モジュール(Type 1)を列挙し、それぞれを一時ディレクトリにエクスポートします。
# エクスポートされたファイルは、VBAエディタで読み込めるようShift-JISで出力されます。
# その後、Gemini CLIが扱いやすいようUTF-8(BOM付き)に変換して上書き保存します。
$workbook.VBProject.VBComponents | ForEach-Object {
if ($_.Type -eq 1) { # Type 1 = 標準モジュール
$moduleName = $_.Name
$sjisPath = Join-Path $exportDir "$moduleName.bas"
$_.Export($sjisPath)
# UTF-8(BOM付き)に変換
$fileContent = [System.IO.File]::ReadAllText($sjisPath, [System.Text.Encoding]::Default)
[System.IO.File]::WriteAllText($sjisPath, $fileContent, [System.Text.Encoding]::UTF8) # BOM付きUTF-8
}
}
}catch {
Write-Error "エラー: モジュールのエクスポートまたはExcelファイルオープン中にエラーが発生しました: $($_.Exception.Message)"
$continueProcessing = $false
}
finally {
# 新規モードの場合、Excelはインポート処理でも使用するため、ここでは閉じない。
}
}
if ($continueProcessing) {
#--------------------------------------------------------------------
# 3. GEMINI.md の自動作成
#--------------------------------------------------------------------
# 一時作業ディレクトリに移動し、Gemini CLIにプロジェクトの指示を伝えるためのGEMINI.mdを作成します。
# これにより、AIはVBAのリファクタリングや新規関数作成に関するコンテキストを事前に認識できます。
Set-Location -Path $exportDir
$geminiMdContent = @"
# Gemini設定
## 言語設定
全ての応答は日本語で行ってください。
## プロジェクトの指示
以下の点について、VBAのリファクタリングおよび新規関数の作成の助けをしてください。
* 可読性の向上
* 処理速度の最適化
* 既存機能の改善提案
* 新規要件に基づく関数の設計と実装
* エラーハンドリングの強化
"@
$geminiMdPath = Join-Path (Get-Location) "GEMINI.md"
try {
Set-Content -Path $geminiMdPath -Value $geminiMdContent -Encoding Utf8 -Force
Write-Host "GEMINI.md ファイルを以下の内容で作成しました: $($geminiMdPath)" -ForegroundColor Green
Write-Host "----------------------------------------------------" -ForegroundColor Green
Write-Host $geminiMdContent -ForegroundColor Cyan
Write-Host "----------------------------------------------------" -ForegroundColor Green
}catch {
Write-Error "エラー: GEMINI.md の作成中にエラーが発生しました: $($_.Exception.Message)"
# GEMINI.mdの作成に失敗しても、後続の処理は続行可能なので return しない。
}
}
}
}
else {
Write-Host "無効な選択です。処理を中断します。"
$continueProcessing = $false
}
# ここから先は、新規モードと再開モードのどちらからも流れ込む共通処理
if ($continueProcessing) {
# 現在の作業ディレクトリを一時フォルダに設定
# 再開モードの場合は、ここで選択された exportDir に移動する
if ($modeChoice -eq "2") {
Set-Location -Path $exportDir
} else { # 新規モードの場合は、GEMINI.md作成時にSet-Locationしているので再設定不要だが、念のため。
Set-Location -Path $exportDir
}
#--------------------------------------------------------------------
# 4. Gemini CLIの起動準備と実行
# - 新規モードの場合
# - 再開モードで「1. Gemini CLI会話モードを再開」を選択した場合
# - それ以外(再開モードで「2. SJIS変換とExcelへのインポート」を選択)はスキップ
#--------------------------------------------------------------------
if (-not $skipGeminiCliLaunch) { # $skipGeminiCliLaunch は再開モードで「2」を選択した場合にtrueになる
$basFiles = Get-ChildItem -Path $exportDir -Filter "*.bas"
if ($basFiles.Count -eq 0) {
Write-Host "エラー: エクスポート対象の標準モジュールが見つかりませんでした。Gemini CLIを起動しても対話できません。" -ForegroundColor Red
Write-Host "処理を中断します。"
$continueProcessing = $false
}
if ($continueProcessing) {
$commandToCopy = ($basFiles | ForEach-Object { "`"@`"$($_.Name)`"" }) -join ' '
Set-Clipboard -Value $commandToCopy
Clear-Host
Write-Host "------------------------------------------------------------------" -ForegroundColor Yellow
Write-Host "クリップボードにコマンドをコピーしました。Gemini起動後に貼り付けてください。" -ForegroundColor Green
Write-Host $commandToCopy -ForegroundColor Cyan
Write-Host "------------------------------------------------------------------" -ForegroundColor Yellow
pause
gemini
}
}
}
#--------------------------------------------------------------------
# 5. SJISへの再変換の選択
# - 新規モードでGemini CLI実行後
# - 再開モードで「1. Gemini CLI会話モードを再開」実行後
# - 再開モードで「2. SJIS変換とExcelへのインポート」を選択した場合
#--------------------------------------------------------------------
if ($continueProcessing) {
Write-Host "Geminiが終了しました。(またはSJIS変換・インポート処理を開始します)"
$sjisChoice = Read-Host "エクスポートされたファイルをShift-JISに再変換しますか? (y/n)"
if ($sjisChoice -eq 'y' -or $sjisChoice -eq 'Y') {
Write-Host "ファイルをShift-JISに再変換します..."
# 一時作業ディレクトリ内の全ての.basファイルを対象に、UTF-8からShift-JISへ再変換します。
$filesToConvert = Get-ChildItem -Path . -Filter "*.bas"
if ($filesToConvert.Count -eq 0) {
Write-Host "警告: Shift-JISに変換する .bas ファイルが見つかりませんでした。インポートはできません。" -ForegroundColor Yellow
$continueProcessing = $false # インポートに進めないため処理を続行しない
}
if ($continueProcessing) {
foreach ($file in $filesToConvert) {
# UTF-8(BOM付き)からShift-JISへ変換
$content = [System.IO.File]::ReadAllText($file.FullName, [System.Text.Encoding]::UTF8)
# 明示的に Shift_JIS を指定
[System.IO.File]::WriteAllText($file.FullName, $content, [System.Text.Encoding]::GetEncoding("Shift_JIS"))
Write-Host " - '$($file.Name)' をShift-JISに変換しました。"
}
Write-Host "全てのファイルのShift-JIS変換が完了しました。"
#--------------------------------------------------------------------
# 6. コピーしたExcelファイルへのインポートの選択と実行
#--------------------------------------------------------------------
$importChoice = Read-Host "変換されたファイルをコピーしたExcelファイル '$($copiedXlsmFileName)' にインポートしますか? (y/n)"
if ($importChoice -eq 'y' -or $importChoice -eq 'Y') {
Write-Host "ファイルを '$($copiedXlsmFileName)' にインポートします..."
try {
# VBAプロジェクトへのアクセスを一時的に有効にし、警告表示を無効にします。
$excel.DisplayAlerts = $false
# インポートの前に、既存の標準モジュールを全て削除します。
# (注意: これにより、コピーファイル内の既存の全ての標準モジュールが置き換えられます。)
$workbook.VBProject.VBComponents | ForEach-Object {
if ($_.Type -eq 1) { # Type 1 = 標準モジュール
Write-Host " - 既存のモジュール '$($_.Name)' を削除します。"
$workbook.VBProject.VBComponents.Remove($_)
}
}
# Shift-JISに再変換された.basファイルを、開いているExcelファイルにインポートします。
foreach ($file in $filesToConvert) {
Write-Host " - '$($file.Name)' をインポートします。"
$workbook.VBProject.VBComponents.Import($file.FullName)
}
# 変更を保存します。
$workbook.Save()
Write-Host "全てのファイルのインポートが完了し、Excelファイル '$($copiedXlsmFileName)' が保存されました。" -ForegroundColor Green
}
catch {
Write-Error "エラー: Excelへのインポート中にエラーが発生しました: $($_.Exception.Message)"
}
finally {
# 警告表示を元に戻します。
$excel.DisplayAlerts = $true
}
} else {
Write-Host "Excelへのインポートはスキップされました。"
}
}
} else {
Write-Host "Shift-JISへの再変換はスキップされました。"
Write-Host "Excelへのインポートは行われません。"
}
}
#--------------------------------------------------------------------
# 7. 終了処理
#--------------------------------------------------------------------
Write-Host "全ての処理が完了しました。"
# 開いているExcelアプリケーションとワークブックを閉じ、COMオブジェクトを解放します。
if ($workbook) {
$workbook.Close($false) # 変更は既に保存済みか、保存しない
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($workbook) | Out-Null
}
if ($excel) {
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
}
# スクリプトを実行した元のディレクトリに戻ります。
if ($scriptDir -and (Test-Path $scriptDir)) {
Set-Location -Path $scriptDir
}
コード解説
- ユーザーに「新規」か「再開」かを選ばせる。
- 再開の場合は、一時作業フォルダを選ぶ。
- .xlsm ファイルを選択。
- 選択ファイルを一時フォルダにコピーし、作業用に使用。
- Excel内の標準モジュールを .bas ファイルとして出力。
- Shift-JIS で出力 → UTF-8(BOM付き) に変換(Gemini用)。
- AIに与える文脈や指示(リファクタ、最適化など)を定義。
- 作業ディレクトリに保存。
- GeminiとVBAコードの対話処理を開始。
- .bas ファイルを引数として提示し、ユーザーに貼り付け指示。
- Gemini CLIは別途ユーザー操作。
リファクタリングや新関数作成等をGeminiに指示する。
- Geminiが返した .bas ファイルをUTF-8 → Shift-JISに戻す。
- Excelファイルの既存モジュールを削除。
- 新しい .bas ファイルをインポート。
- 保存。
作業ディレクトリを元に戻る。
処理内容 | 解説 |
Excel操作 | COMオブジェクトで非表示実行。ファイルの安全確保と自動処理。 |
Shift-JIS ? UTF-8変換 | Excel⇔AIの橋渡し。VBAはShift-JIS、AIはUTF-8前提。 |
GEMINI.md | AIとの会話をスムーズにする設定ファイル。 |
モジュールの入れ替え | 既存を削除し、AI生成のものに差し替える。 |
モード分岐 | 途中中断からでも再開可能にする設計。 |
5. 活用事例と実践のヒント
- リファクタリングの例:
「このコードの可読性を向上させてほしい」「このループ処理をより効率的に書き直してほしい」「この長いプロシージャを複数の関数に分割する提案がほしい」といった具体的な問いかけを通じて、Geminiから改善案を引き出すことができます。 - 新規関数作成の例:
「指定された条件に基づいてセルを色付けするVBA関数を作成してほしい」「特定の範囲のデータを別のシートに転記する関数を記述してほしい」といった機能要件を伝えることで、関数の骨格や実装例を迅速に生成させることができます。 - コードレビューの活用:
既存のVBAモジュールをGeminiに読ませて、「このコードの潜在的なバグや改善点はあるか?」「この処理はVBAのベストプラクティスに沿っているか?」といった質問をすることで、人間の目では見落としがちな問題をAIが指摘してくれる可能性があります。
VBAerへのアドバイス:AIとの協調と最終確認の重要性
以下の点を常に意識して、AIの出力を最大限に活用してください。
- 得意なこと(活用を推奨):
- 新規関数の作成: 特定の処理要件に基づいた関数の骨子やロジックの生成は非常に得意です。ゼロから始める際のアイデア出しや、処理の効率的な記述方法の提案に優れています。
- 一般的なリファクタリング: コードの可読性向上(変数名の改善、コメント追加、構造化)、重複コードの排除、基本的なパフォーマンス最適化(例:ループの効率化)など、汎用的な改善提案は有能です。
- コードの意図解釈と説明: 既存コードの機能や目的を分析し、理解しやすい言葉で説明してくれます。
- 苦手なこと(注意が必要):
- VBAの細部の文法チェックや特定の環境依存: VBA特有の厳密な文法エラーや、Excelのバージョン、参照設定、または特定のCOMオブジェクトの細かな挙動、アプリケーション固有の癖などについては、誤った解釈や提案をする可能性があります。例えば、Excelオブジェクトのプロパティの厳密な型、ADOやDAOなど特定のライブラリの詳細な使用法、Variant型の暗黙の型変換に伴う挙動などは、人間による最終確認が不可欠です。
- 複雑なロジック全体の完璧な生成: 極めて複雑な業務ロジックや、複数のモジュールにまたがる高度な依存関係を、一度の指示で完璧に生成することは難しい場合があります。
この特性を理解した上で、Geminiを「高度なアシスタント」として活用することが成功の鍵となります。特に新規関数のアイデア出しや既存コードの骨子の改善においては、その能力を最大限に引き出すことができるでしょう。
- バグの有無: 論理的な誤りや、VBAの特定のバージョン・環境で動作しない構文がないか。
- 既存コードとの整合性: 既存のVBAプロジェクト内の他のモジュールや関数との整合性が取れているか。
- パフォーマンス: AIが提案した変更が、実際の実行速度に悪影響を与えないか。
- 可読性と保守性: AIの生成したコードが、将来の自分や他の開発者にとって理解しやすく、メンテナンスしやすいか。
- ExcelのCOMオブジェクト操作の特殊性: 特定のExcelオブジェクトのプロパティやメソッドが正しく使用されているか。
6. スクリプトを簡単に起動するための.batファイルの活用
@echo off
powershell.exe -ExecutionPolicy Bypass -File "%~dp0Run-Gemini-On-Excel-Modules.ps1"
pause
.batファイルの内容解説
- @echo off: コマンドプロンプトに表示されるコマンド自体を非表示にします。
- powershell.exe: PowerShell実行ファイルを呼び出します。
- -ExecutionPolicy Bypass: PowerShellの実行ポリシーを一時的に「Bypass」に設定します。これにより、署名されていないスクリプトでも警告なしに実行できるようになります。このオプションは利便性を高めますが、後述の「セキュリティ上の注意点」を十分に理解して使用してください。
- -File "%~dp0Run-Gemini-On-Excel-Modules.ps1": 実行するPowerShellスクリプトのパスを指定します。
- %~dp0: .batファイル自身が置かれているディレクトリのパスを示します。これにより、.batファイルと.ps1ファイルが同じディレクトリにあれば、どこに配置してもスクリプトを正しく見つけて実行できます。
- Run-Gemini-On-Excel-Modules.ps1: 実行したいPowerShellスクリプトのファイル名です。
- pause: PowerShellスクリプトの実行が終了した後、コマンドプロンプトのウィンドウが自動的に閉じないように一時停止します。これにより、実行結果やエラーメッセージを確認する時間を確保できます。
- 簡単な起動: .batファイルをダブルクリックするだけで、複雑なコマンドライン入力をすることなくスクリプトを実行できます。
- ポータビリティ: Run-Gemini-On-Excel-Modules.ps1と同じフォルダに置けば、パスを気にすることなくツールをどこにでも配置して利用できます。
- 実行ポリシーの簡便な対応: 多くのユーザー環境でPowerShellスクリプトをスムーズに実行するために、実行ポリシーの変更を個々に行う手間を省きます。
- PowerShellの実行ポリシーは、悪意のあるスクリプトの実行を「意図せず」防ぐための安全策であり、セキュリティ境界ではありません。
Bypassポリシーは「何もブロックされず、警告やプロンプトも表示されない」状態を意味します。 - スクリプトの信頼性: この.batファイルを使用する際は、実行するRun-Gemini-On-Excel-Modules.ps1スクリプトの内容を完全に信頼していることが前提となります。もしスクリプトが悪意のあるコードに改ざんされたり、意図しない動作をするように変更されたりした場合、この.batファイルを介してそれらが警告なしに実行されてしまうリスクがあります。
- 配布・共有時の注意: 本ツールを他のユーザーに配布する場合、必ずこのセキュリティ上の注意点を明確に伝える必要があります。信頼できないソースからダウンロードしたスクリプトに対して、安易にBypassオプションを使用するべきではありません。
- 定期的な確認: ご自身で利用する場合でも、Run-Gemini-On-Excel-Modules.ps1の内容が、意図しない変更を受けていないかを定期的に確認することを強く推奨します。
この.batファイルは、VBA開発者がAI活用を加速するための個人的なツールとして、その利便性から非常に有効な起動方法です。
上記の注意点を理解した上で、安全に活用してください。
7. 今後の展望と改善の方向性
- スクリプトのさらなる自動化・機能拡張:
Excelの参照設定の自動管理、クラスモジュールやユーザーフォームのエクスポート・インポート対応、特定のコードスニペットの自動置換機能などが考えられます。 - 他の生成AIモデルとの連携:
Gemini以外の生成AIモデル(例: AnthropicのClaude、OpenAIのGPTシリーズなど)との連携を可能にすることで、VBAerはより多くの選択肢を持つことができます。 - より詳細なログ出力:
現在のスクリプトはエラー発生時にメッセージを表示しますが、処理の各段階で詳細なログを出力することで、問題発生時の原因特定やデバッグが容易になります。 - 簡易GUIの提供:
PowerShellとWindows Formsを組み合わせることで、コマンドライン操作に不慣れなVBAerでも直感的に利用できる簡易GUIを提供する可能性もあります。
8. おわりに
生成AIを開発ワークフローに積極的に取り入れることで、VBAerの皆様は、日々のルーティン作業から解放され、より創造的で価値の高い開発業務に集中できるようになるでしょう。
VBAerの皆様がこの新しい技術を習得し、VBA開発の未来を切り開く一助となれば幸いです。
※本記事の作成にあたっては、一部の文章作成に生成AI(Gemini)を使用しています。最終的な内容は人間による確認・編集を経て掲載しています。
同じテーマ「生成AI活用研究」の記事
生成AIパスポート試験 練習問題(四肢択一式)
Googleカレンダーの日本の祝日をGASとExcelで取得する ~APIキー不要、XML連携ガイド~
我思う、そこにAI在り:ひらめきを増幅する、AIと「考える」新しい形
Excel×スプレッドシート連携:HTTP GETで学ぶGAS API設計入門
AI時代のプログラミング再考:記述の自由と知の民主化
生成AIと脱Excelの時代:ブラックボックスと共に進む知的変革
AI時代の働き方革命:オンリーワン戦略 ― 属人化で搾取されない労働者に
不合理の砦|AIが計算を終えた場所から、人間の価値が始まる
Gemini CLIの徹底解説:AIをターミナルから使いこなす
「Gemini CLI」によるExcel自動化フレームワーク:実践ガイド
Gemini CLIとPowerShellでVBAerのAI活用を加速する実践ガイド
新着記事NEW ・・・新着記事一覧を見る
Gemini CLIの徹底解説:AIをターミナルから使いこなす|生成AI活用研究(2025-07-03)
Gemini CLIとPowerShellでVBAerのAI活用を加速する実践ガイド|生成AI活用研究(2025-07-02)
「Gemini CLI」によるExcel自動化フレームワーク:実践ガイド|生成AI活用研究(2025-07-01)
AI(Gemini)とエクセル数式対決 その3|生成AI活用研究(2025-06-24)
不合理の砦|AIが計算を終えた場所から、人間の価値が始まる|生成AI活用研究(2025-06-23)
生成AIはExcelの複雑な数式を書けるのか?|AIとの対話から学ぶ協業のリアル|生成AI活用研究(2025-06-22)
日時データから日付ごとの集計(UNIQUE,SUMIFS,GROUPBY)|エクセル雑感(2025-06-20)
AI時代の働き方革命:オンリーワン戦略 ― 属人化で搾取されない労働者に|生成AI活用研究(2025-06-20)
VBA開発の標準化を実現する共通プロンプトのすすめ|生成AI活用研究(2025-06-14)
生成AIと100本ノック 29本目:画像の挿入|生成AI活用研究(6月13日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.