自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

PythonからExcelのVBA(マクロ)を実行する方法

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サイトのドロップシッピング商材の在庫更新を自動でやる」というもの。フローは以下の通り。

  1. 取引先の卸サイトにログイン
  2. 卸サイトから在庫データ(CSVやExcelファイル)を所定のフォルダにダウンロード
  3. 自社ECの在庫管理ツールから在庫データ(CSV)を所定のフォルダにダウンロード
  4. 2と3を元にエクセル上で商品コードごとに最新の在庫情報へ書き換える
  5. 在庫管理ツールにCSVファイルをアップロード

このうち1~3と5はPythonにSeleniumをインポートして行っているが、4のExcelでの在庫更新データの計算式が地味に複雑で(納期情報文言の正規化とか) わざわざPythonで作り直すのが面倒なため今回の「Pythonからマクロを実行する」ことが必要になったわけです。

意外とシンプルにかけたので満足していますが、やはり言語をまたぐとエラー処理とかどうしよ・・・ってかんじ。