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
引数で渡した値を含めたメッセージが表示されます。

以上です!