xlwingsを使えば、PytonからExcelブックを編集することが可能ですが、文字色や背景色、罫線などの属性をプログラムから設定するのは面倒です。
対策としては、Excel側でレイアウトを作成し、それをテンプレートとしてPythonからデータを流し込むという方法がよく使われます。
まれにですが、データを流し込む前後にExcelのマクロを実行したいことが発生します。
例えば、マクロが含まれているExcelブックがあって、そのマクロを流用したいとか、xlwings では記述が複雑なため、マクロ側で処理した方が都合が良いといった場合です。
ということで、今回は xlwings でマクロを実行する方法について解説します。
xlwings で Excelを読み書きしたり、グラフを描画したい方は、下記の記事をご覧ください。
Excelマクロを呼び出す手順
サンプルプログラム
シート上のグラフを jpg 出力するマクロを、Pythonから呼び出す場合を例に具体的なコードを紹介していきます。
Excelマクロは、 "SaveChart" という名前が付けられており、マクロへの引数としてイメージ保存用のフォルダを渡す仕様になっています。
Python側のソースコード
Python側は次のようになります。
xw.app(visible=False) と記述することで、Excelアプリケーションを非表示にして起動しています。
また、マクロを呼び出す際の引数に "d:\\" と記述していますが、これは マクロ側(VBA側)が¥文字を特殊文字として扱う仕様であるため、エスケープする必要があるからです。
マクロにファイル名、フォルダ、パス等を渡す場合は、この点にご注意ください。
1 2 3 4 5 6 7 8 9 |
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)するようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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側にマクロがあって、それを流用したいという場合には非常に便利なので、是非ご活用下さい。
コメント