xlwingsを使えば、PytonからExcelブックを編集することが可能ですが、文字色や背景色、罫線などの属性をプログラムから設定するのは面倒です。
対策としては、Excel側でレイアウトを作成し、それをテンプレートとしてPythonからデータを流し込むという方法がよく使われます。
まれにですが、データを流し込む前後にExcelのマクロを実行したいことが発生します。
例えば、マクロが含まれているExcelブックがあって、そのマクロを流用したいとか、xlwings では記述が複雑なため、マクロ側で処理した方が都合が良いといった場合です。
ということで、今回は xlwings でマクロを実行する方法について解説します。
xlwings で Excelを読み書きしたり、グラフを描画したい方は、下記の記事をご覧ください。

Excelマクロを呼び出す手順

サンプルプログラム
シート上のグラフを jpg 出力するマクロを、Pythonから呼び出す場合を例に具体的なコードを紹介していきます。
Excelマクロは、 "SaveChart" という名前が付けられており、マクロへの引数としてイメージ保存用のフォルダを渡す仕様になっています。
Python側のソースコード
xw.app(visible=False) と記述することで、Excelアプリケーションを非表示にして起動しています。
また、マクロを呼び出す際の引数に "d:\\" と記述していますが、これは マクロ側(VBA側)が¥文字を特殊文字として扱う仕様であるため、エスケープする必要があるからです。
マクロにファイル名、フォルダ、パス等を渡す場合は、この点にご注意ください。
import xlwings as xw
#マクロの実行
excel = xw.App(visible=False)
wb = excel.books.open('d:/scatter.xlsm')
macro= wb.macro('SaveChart')
macro('d:\\')
wb.close()
excel.quit()
Excel側のコード
Pythonから呼び出されるマクロは以下の通りです。
引数で渡されたフォルダに対して、グラフのタイトルと拡張子(jpg) を付加してパスを作成し、ファイル出力(Export)するようになっています。
Option Explicit
Sub SaveChart(folder As String)
Dim i As Integer
Dim title As String
'シート内のグラフを全て取り出してファイル出力する
For i = 1 To ActiveSheet.ChartObjects.Count
title = ActiveSheet.ChartObjects(i).Chart.ChartTitle.Text
ActiveSheet.ChartObjects(i).Chart.Export (folder & title & ".jpg")
Next
End Sub
このマクロが搭載されているシートは次の様になっています。

下記はExcel上でマクロを開いた状態の画像です。
標準モジュール(Module 1)にマクロを記述しています。

Excelマクロを作るための設定方法について
マクロを編集する場合、メニューに「開発」タブが表示されていないと編集できません。
Excel側で設定を行う必要がありますので、その手順を紹介しておきます。
図に従って、①~⑤をクリックしてください。

以上の操作で「開発」タブがメニューに表示されます。
⑥~⑨の順番で操作してもらえれば、マクロ編集のウィンドウが表示されます。

まとめ
今回は xlwings を使って、PythonからExcelマクロを呼び出す方法について説明しました。
PythonからExcelマクロを呼び出す際、任意の数だけ引数を指定できますので、汎用的な処理が実現可能です。
注意点としては、引数に’¥’が含まれていると、Excelマクロ側が特殊文字として処理してしまうため、Python側でエスケープが必要になることぐらいです。
既にExcel側にマクロがあって、それを流用したいという場合には非常に便利なので、是非ご活用下さい。
コメント