C:\macro_book.xlsm
というExcelファイルのmsg
というマクロをPythonから実行する場合は以下のようになる
import win32com.client # ライブラリをインポート excel = win32com.client.Dispatch("Excel.Application") # インスタンス生成 excel.Visible = 1 # エクセルを表示する設定(0にすれば非表示で実行される) excel.Workbooks.Open(Filename="C:\macro_book.xlsm", ReadOnly=1) # ブックを読み取り専用で開く excel.Application.Run('msg("aaa")') # マクロ名を指定して実行(引数なしの場合マクロ名のみで実行可能) excel.Workbooks(1).Close(SaveChanges=1) # ブックを保存して閉じる(SaveChangesを0にすると保存せず閉じる) excel.Application.Quit() # 終了
なんでわざわざPythonから?という意見はごもっともなんだけど、実際の仕事で使ってる内容としては 「ECサイトのドロップシッピング商材の在庫更新を自動でやる」というもの。フローは以下の通り。
- 取引先の卸サイトにログイン
- 卸サイトから在庫データ(CSVやExcelファイル)を所定のフォルダにダウンロード
- 自社ECの在庫管理ツールから在庫データ(CSV)を所定のフォルダにダウンロード
- 2と3を元にエクセル上で商品コードごとに最新の在庫情報へ書き換える
- 在庫管理ツールにCSVファイルをアップロード
このうち1~3と5はPythonにSeleniumをインポートして行っているが、4のExcelでの在庫更新データの計算式が地味に複雑で(納期情報文言の正規化とか) わざわざPythonで作り直すのが面倒なため今回の「Pythonからマクロを実行する」ことが必要になったわけです。
意外とシンプルにかけたので満足していますが、やはり言語をまたぐとエラー処理とかどうしよ・・・ってかんじ。