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

引数で渡した値を含めたメッセージが表示されます。

以上です!