Pythonからエクセルマクロを実行する方法
こんにちは。はけです。
WEB系エンジニアとして6年間やってきました。
今回は次のような悩みを持つ方向けに、Pythonからエクセルマクロを呼び出して実行する方法をまとめました。
- Pythonを覚えたはいいものの、エクセル操作は今まで使っていたマクロを使いたい!
- Pythonからマクロを呼び出して実行したいけどやり方がわからない!
この記事を読むことで、次のようなことが出来るようになります!
- Pythonからのエクセルマクロを呼び出す
- エクセルマクロへの引数の渡し方がわかる
最近、Pythonの業務自動化が流行っている中、
私も業務の自動化に取り組んでいます。
ですが、、Pythonで自動化をするのはいいけど
これまで使用していたマクロを捨ててしまうのはもったいない!
どうせならこれまでのマクロをPythonから使えるようにしたい!
今のツールを活用しつつ、さらなる業務改善を進めたい!
と思い、調べたところ、
Pythonからマクロを呼び出して使えるようになりました!
ではその方法を解説していきます。
目次
実行環境
- Windows10
- Python3.7.6
- pywin32 227
Pythonからのエクセルマクロの呼び出し
Pythonからエクセルマクロを呼び出すための手順は2つです。
- ライブラリのインストール
- マクロの呼び出し
ライブラリのインストール
pywin32というPythonのライブラリを使用します。
pywin32(win32com)は外部ファイルを呼び出し、操作するためのライブラリで、Excelと相性がいいです。
コマンドプロンプトやPyCharmでpywin32をインストールしてください。
コマンドプロンプトの場合は以下のコマンドを実行。
pip install pywin32
pywin32のライブラリがインストールできます。
ライブラリのインストールは以上。
マクロの呼び出し
では、マクロを呼び出してみましょう!
テスト的に以下のPythonファイルとマクロを作成してください。
# win32comライブラリのインポート import win32com.client # Excelを起動する app = win32com.client.Dispatch("Excel.Application") # エクセルを表示する設定(0にすれば非表示で実行される) app.Visible = 1 # 指定したブックを読み取り専用で開く app.Workbooks.Open(Filename=r"C:\Users\hogehoge\Desktop\call_test.xlsm", ReadOnly=1) # マクロ名を指定して実行 app.Application.Run('test_call()') # マクロ実行完了後、ブックを保存して閉じる(SaveChanges=0にすると保存せずに閉じる) app.Workbooks(1).Close(SaveChanges=1) # アプリケーション終了 app.Application.Quit()
Sub test_call() MsgBox "HELLO! EXCEL MACRO!" End Sub
このPythonコードを実行することで、マクロが実行され、メッセージが出れば呼び出し成功です!
マクロの作り方が分からない人のために、以降にマクロの作り方を補足しています。
参考にしてください。
マクロの作り方※補足
マクロはデフォルト設定のExcelでは作成出来ません。
以下の手順でマクロを作成してください。
リボンのユーザ設定
Excel起動→ファイル→オプション→リボンのユーザ設定→「開発」にチェック→OK
マクロの作成
「開発」タブ→「マクロ」→関数名入力→「作成」
コード入力
マクロ実行確認
「開発」タブ→「マクロ」→関数名選択→「実行」
メッセージボックスが出ればマクロの実行が成功です。
エクセルマクロへの引数の渡し方
次に、エクセルマクロへの引数の渡し方を解説します。
Pythonと連携する上で、Pythonで計算した数値や文字列をマクロ側でも使いたい!ということが出てくると思います。
次に書いている2ファイルを作成し、実行してみてください。
# win32comライブラリのインポート import win32com.client # Excelを起動する app = win32com.client.Dispatch("Excel.Application") # エクセルを表示する設定(0にすれば非表示で実行される) app.Visible = 1 # 指定したブックを読み取り専用で開く app.Workbooks.Open(Filename=r"C:\Users\hogehoge\Desktop\call_test.xlsm", ReadOnly=1) # マクロ名を指定して実行 str = 'TEST_CALL!' # ★strに引数で渡す値を設定 app.Application.Run('test_call', str) # ★カンマ区切りで引数を指定(複数指定可能) # マクロ実行完了後、ブックを保存して閉じる(SaveChanges=0にすると保存せずに閉じる) app.Workbooks(1).Close(SaveChanges=1) # アプリケーション終了 app.Application.Quit()
Sub test_call(arg1 As String) ' ★引数を追加 MsgBox "HELLO! EXCEL MACRO!" + arg1 ' ★引数をメッセージ出力に追加 End Sub
引数で渡した値を含めたメッセージが表示されます。
以上です!