ExcelマクロをPyInstallerでexe化して社内配布した手順。Pythonが入っていないPCでも動いた

Pythonで自動化ツールを作成しました。自分の環境では完璧に動くのですが、いざ同僚に渡そうとした瞬間。手が止まってしまいます。相手のPCにはPythonが入っていないからです。「環境構築からお願い」なんて、気後れして言えるはずもありません。

IT部門への申請書を出した時と、感触が似ていました。「お手数ですが、Pythonのインストールをお願いできますか」と切り出すと。相手の顔にそこはかとない警戒心が浮かびます。「それって会社のPCに入れても大丈夫なの?」という一言で会話が止まり。それ以上頼めなくなってしまうのです。

まず、そこで見つけたのがPyInstallerによるexe化です。これなら相手の環境を問わず、ダブルクリックするだけでツールが動くようになります。

PyInstallerでPythonをEXE化

自動化ツールを作った人間が必ずぶつかる壁があります。自分のPCでは完璧に動くのに、隣の席の同僚のPCでは動きません。理由は明白で、相手のPCにはPythonがインストールされていないからです。

情報システム部の許可を取って、Pythonをインストールして。必要なライブラリをpipで入れて……。そんな手順書を渡した時点で、ツールの利用率はゼロになってしまいます。同僚もそこまで暇ではありませんから。

distフォルダ内に生成されたexeファイル

Pythonのインストール自体が困難な社内環境の実情については、会社PCにPythonを入れられない問題の実録に詳しくまとめています。そこでPyInstallerの出番です。書いたPythonスクリプトをWindowsでそのまま動く「.exe」ファイルに変換してくれるツールです。変換さえしてしまえば、Pythonの実行環境は不要になります。ダブルクリックするだけで、普通のアプリと同じように動くようになります。

PyInstallerのシンプルな使い方

使い方は拍子抜けするほどシンプルです。コマンドプロンプトやターミナルを開き、インストールを実行します。

pip install pyinstaller

まず、次に。04/pip-install-pyinstaller-2.webp” alt=”コマンドプロンプトでPyInstallerをインストールしている画面” />。

インストールが終わったら、対象のスクリプトがあるフォルダに移動します。一番基本となるコマンドを入力します。

Pythonスクリプトを社内配布できない。その壁とPyInstallerという解決策に関する解説図(日本語UI)

pyinstaller --onefile スクリプト名.py

PyInstallerでのスマートなexe作成

一方で、「–onefile」オプションを使うことで。関連するファイルを一つのexeファイルにまとめてくれます。バラバラのファイル群を渡す必要はありません。処理が終わると、同じフォルダ内にいくつかのフォルダが自動生成されます。目当てのexeファイルは「distフォルダ」の中に入っています。

GUIツールを作った場合。実行時に黒いコマンドプロンプト画面が裏で開いてしまいます。これを消すには「–noconsole」オプションを追加してください。

pyinstaller --onefile --noconsole スクリプト名.py

Pythonのインストール自体が困難な社内環境の実情についてはに関する解説図(日本語UI)

そのため、これだけで、裏で余計な画面が開かないスマートなツールになります。

ExcelとPython連携で業務効率化

PyInstallerでexe化されたPythonツールは単独で動きます。しかし、多くの総務や経理、人事担当者にとって。日々開くのはExcelファイルです。使い慣れたExcelのボタン一つでPythonの強力な処理が実行できれば。業務効率化のインパクトは計り知れません。

Excelマクロ(VBA)からexeファイルを呼び出す仕組みは、Windowsの基本的なプロセス実行機能を利用します。具体的には、VBAの`Shell`関数を使います。この関数は、指定されたプログラムを新しいプロセスとして起動します。例えば、メモ帳やペイントのようなアプリをVBAから起動できるのと同じ理屈です。

この`Shell`関数に、PyInstallerで生成したexeファイルのパスを渡せば、VBAの操作からPythonの処理をトリガーできます。ユーザーはPythonが裏で動いていることを意識せず、普段通りのExcel操作だけで複雑な処理を実行できるというわけです。

しかし、最もシンプルな呼び出し方は次のようになります。

VBAからPython EXEへの引数渡し

“`vba
Sub CallPythonExe()
Dim exePath As String
exePath = ThisWorkbook.Path & “\your_script.exe” ‘ Excelファイルと同じフォルダにある場合
Shell exePath, vbNormalFocus
End Sub
“`

ここで重要なのは、VBAからexeファイルに情報を渡す方法です。Pythonスクリプトは、コマンドライン引数を受け取ることができます。例えば、Excelファイル内の特定のセル範囲やシート名、あるいは処理の条件などを引数としてexeファイルに渡せます。そうすれば、Pythonスクリプトは受け取った引数に基づいて異なる処理を実行できるようになります。

VBAの`Shell`関数の第二引数に、実行したいコマンドと引数をスペース区切りで指定するだけです。

VBAからPythonへ引数連携

さらに、“`vba
Sub CallPythonExeWithArguments()
Dim exePath As String
Dim arg1 As String
Dim arg2 As String

exePath = ThisWorkbook.Path & “\your_script.exe”
arg1 = “シート名”
arg2 = “処理対象データ”

Shell exePath & ” ” & arg1 & ” ” & arg2, vbNormalFocus
End Sub
“`

まず、Pythonスクリプト側では、`sys.argv`を使ってこれらの引数を受け取ります。`sys.argv[0]`はスクリプト自身のパス、`sys.argv[1]`以降が渡された引数となります。この仕組みを使えば、ExcelのUIでユーザーが選択した内容をPythonの処理に反映させる柔軟なツールが構築できます。

なぜなら、Pythonスクリプトは汎用的な処理ロジックを持ち、VBAから渡される引数によってその振る舞いを動的に変えられるからです。

VBAからのPython処理待機

さらに、Pythonの処理が完了するまでVBAの次の処理を待機させたいケースもあるでしょう。`Shell`関数は基本的に非同期で動作し、exeファイルを起動したらVBAはすぐに次の行に進んでしまいます。Pythonの処理が完了する前にVBAが次のセルを読み書きしようとすると、ファイルロックやデータ不整合といった問題が発生しかねません。

これを防ぐには、VBA側でPythonプロセスの終了を待つ処理を加える必要があります。`Shell`関数の戻り値であるタスクIDを使って、WMI(Windows Management Instrumentation)オブジェクト経由でプロセス監視を行う方法や、よりシンプルに一時的なフラグファイルを作成してPythonの終了を検知する方法などがあります。

しかし、多くの場合、Pythonの処理がバックグラウンドで完結し、結果を別のファイルに出力するような設計であれば、VBAが待機せずとも問題ないこともあります。

💡 ここで一度立ち止まって考えてみてください

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

相対パスでExcel-exeポータブル化

PyInstallerで生成したexeファイルとExcelファイルを同じフォルダに配置し、VBAから相対パスで呼び出すのが最も管理しやすい方法です。`ThisWorkbook.Path`プロパティを使えば、Excelファイル自身が存在するフォルダのパスを取得できます。これにより、ツールセットをどこにコピーしても問題なく動作するようになり、配布が非常に楽になります。

パスが固定されていないため、ユーザーは任意の場所にファイルを保存できます。これは社内配布の利便性を大きく向上させる要素となります。

PyInstaller製exe、セキュリティソフトの壁

PyInstallerのインストールと基本的なexe化コマンドに関する解説図(日本語UI)

次に、PyInstallerで生成したexeファイルは。Python環境がないPCでも動作する手軽さが魅力ですが。社内配布を進める上でいくつかの現実的な壁にぶつかることがあります。これらの課題を事前に理解し、対策を講じることが、ツールを定着させる鍵となります。

まず、最も頻繁に遭遇するのがセキュリティソフトによるブロック問題です。PyInstallerが生成するexeファイルは。内部的にPythonのインタープリタや必要なライブラリをまとめて含んでいるため。一般的なソフトウェアとは異なる構造を持ちます。そのため、一部の企業向けセキュリティソフトやWindows Defenderが。未署名のexeファイルを「潜在的に危険なファイル」と誤認し。

ブロックしたり削除したりするケースがあるのです。これは、マルウェアが同様の手法でパッケージ化されることがあるため。セキュリティソフトが警戒する自然な反応と言えます。

情シス連携でツールをスムーズ導入

「このファイルは危険なので実行できません」というメッセージがユーザーの画面に表示された時。現場の担当者は「また余計なものを作ってくれた」という冷たい視線を送りがちです。このような事態を避けるには。配布前に情報システム部門へ相談するのが最善策となります。作成したツールが何をするものなのか、具体的な用途と安全性について説明し。必要であればセキュリティソフトのホワイトリスト登録を依頼してください。

なぜブロックされるのかを理解し。その理由を情報システム部門に適切に説明することが。スムーズな導入への第一歩となります。彼らも企業のセキュリティを守るプロであり。正当な理由があれば協力的である場合が多いです。

ツール更新・配布の課題解決

次に、ツールのアップデートとメンテナンスの課題があります。Pythonスクリプトを改善したり、バグを修正したりするたびに。PyInstallerでexeファイルを再生成し、その都度。全ユーザーに配布し直す必要があるからです。数百人規模の組織でこれを手作業で行うのは非現実的です。利用者が多いほど、アップデートの手間は増大します。

この問題を軽減するためには、exeファイルを特定の共有フォルダに一元管理し。ユーザーが常に最新版をそこからダウンロードするような運用ルールを設けることが考えられます。あるいは、VBAからexeファイルを起動する前に。共有フォルダのタイムスタンプとローカルのexeファイルのタイムスタンプを比較し。自動的に最新版をコピーするような仕組みを組み込むのも有効です。なぜなら、ユーザーの手動更新に依存すると。

バージョン間の不整合や古いバグが温存されるリスクが生じるからです。

exe化Pythonエラー発生時の対応課題

さらに、運用中のエラー発生時の対応も考慮しておくべき点です。exeファイルとして動作しているPythonスクリプトがエラーを起こしても。通常は黒いコンソールが一瞬表示されて消えるか。何も表示されずに終了するだけになってしまいます。ユーザーは何が起きたのか分からず、ただ「動かない」と報告するしかありません。この状況では、原因特定が非常に困難になります。

Pythonログでトラブル解決

この問題の解決策は、Pythonスクリプトに適切なログ出力機能を組み込むことです。エラー発生時だけでなく、処理の開始・終了、主要なステップの進行状況、重要な変数の中身などをログファイルに記録させます。Pythonの標準ライブラリである`logging`モジュールを活用すれば、簡単にログ出力を実装できます。

ログファイルはexeファイルと同じフォルダや、特定のログ保存用フォルダに出力するように設計してください。なぜログが重要なのかというと、利用者が「動かない」と訴えてきた際に、そのログファイルを確認するだけで、エラーの原因や実行時の状況を把握できるからです。ログは、開発者にとっての目であり耳となり、トラブルシューティングの強力な手助けとなります。これにより、運用後のサポートコストを大幅に削減できます。

配布用フォルダ構成

一方で、配布する際のフォルダ構成も一考の価値があります。exeファイルが単独で動作する場合もあれば、設定ファイルや連携するCSVファイル、テンプレートExcelファイルなどを必要とする場合もあるでしょう。これらの関連ファイルを全て一つのフォルダにまとめ、Excelファイルからの相対パスでアクセスできるよう構成すれば、配布時のミスを減らせます。例えば、`ツールフォルダ/your_script.exe`、`ツールフォルダ/settings.ini`、`ツールフォルダ/templates/template.xlsx`といった階層で管理すると、ユーザーはフォルダごとコピーするだけで利用できるため、混乱を招きにくいです。なぜなら、ファイルの配置に依存するエラーは、ユーザーにとって最も理解しにくく、ストレスの原因となるからです。

関連リンクとチェックリスト

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →