Claude Opus 4.7
VSCODE 拡張プラグインXVBAで、開発実装中です。環境はwindows11です。
要件は、Python にて、Akamai API を叩いた結果をCSVに出力。そのCSV をExcel worksheet に取り込むというものです。
セットアップを軽くする為、開発地はVSCODE を用いていますが、実行時はExcel だけで完結出来ないか模索しています。
実行環境にはPython を導入済みであること。を前提に、Excel の設定シートにVBA マクロを埋め込んで置き、システム環境変数もしくはユーザー環境変数を検索し、Python の導入パスを特定のセルに格納します。
そのパスにあるPython を用いて、ワークブックに埋め込んだPythonTest.pyを実行したいと考える。PythonTest.pyは、実行時にはワークブックのパスと同じディレクトリに格納されて、それを呼び出す形にしたい
ExcelからPython実行する仕組みの実装
ご要件を整理すると以下のフローになります。
- Excel起動時/ボタン押下時に環境変数からpython.exeのパスを検索
- 特定セルにパスを格納
- ワークブック同一ディレクトリにPythonTest.pyを展開(必要なら埋め込みから書き出し)
- そのPythonでスクリプトを実行し、CSV出力
- 出力CSVをワークシートに取り込み
以下、実装例を示します。
1. シート構成(例: Configシート)
| セル | 内容 |
|---|---|
| B2 | Python実行パス(マクロが自動格納) |
| B3 | スクリプト名(例: PythonTest.py) |
| B4 | 出力CSVパス(例: output.csv) |
| B5 | 取り込み先シート名(例: Data) |
2. VBAコード(標準モジュール)
Untitled
vba
3. スクリプト埋め込みの考え方
VBAから直接.pyファイルを書き出す方式が最もシンプルです。方法は2通り:
方法A: 専用シート(ScriptSource)にコードを1行ずつ格納
上記DeployEmbeddedScriptが対応。シートはxlSheetVeryHiddenにしておけばユーザーから不可視にできます。
方法B: VBAの定数文字列に丸ごと保持
コードが短い場合のみ向き。長文だとVBAの行長制限で煩雑になります。
Akamaiクライアントのように外部依存(requests, edgegrid-python等)が必要なら、方法Aでrequirements.txtも同梱・展開し、初回起動時にpip installさせる仕組みを足すと良いです。
4. PythonTest.py 側の最低構造
PythonTest
py
5. 注意点・推奨事項
- 環境変数の取得: VBAのEnviron$("PATH")はExcelプロセス起動時にマージされた値(システム+ユーザー)を返すため、別々に取得する必要はありません。ただしマクロ実行中にユーザーが環境変数を変更しても反映されない点に注意。
- Microsoft Storeのpython.exeスタブ: %LOCALAPPDATA%\Microsoft\WindowsApps\python.exeはインストール誘導用のダミーです。これを掴まないよう、検出後に--versionで実行確認するか、WindowsAppsを除外するロジックを追加すると安全です。
- CSV取り込み: 上記は単純なカンマ分割です。Akamai応答に改行・カンマ・引用符を含む値が出る場合はQueryTables.AddまたはWorkbooks.OpenTextを使うか、Python側でTSVやJSONを返してパースする方が堅牢です。
- 文字コード: PythonがUTF-8で書き出すため、ExcelのVBAでOpen ... For Inputすると日本語が化けます。日本語を扱うならADODB.Streamを使ったUTF-8読み込みに置き換えてください。
UTF-8対応版のCSV読み込みが必要であれば、その部分を追加で提示します。
追加要件ですが、Python -m venv venv を実行させたうえで、必要なモジュールを導入するソースも上記にマージして下さい