【よく分かる】xlwings でExcelマクロを実行しよう by Python

当ページのリンクには広告が含まれています。

xlwingsを使えば、PytonからExcelブックを編集することが可能ですが、文字色や背景色、罫線などの属性をプログラムから設定するのは面倒です。

対策としては、Excel側でレイアウトを作成し、それをテンプレートとしてPythonからデータを流し込むという方法がよく使われます。

まれにですが、データを流し込む前後にExcelのマクロを実行したいことが発生します。

例えば、マクロが含まれているExcelブックがあって、そのマクロを流用したいとか、xlwings では記述が複雑なため、マクロ側で処理した方が都合が良いといった場合です。

ということで、今回は xlwings でマクロを実行する方法について解説します。
xlwings で Excelを読み書きしたり、グラフを描画したい方は、下記の記事をご覧ください。

あわせて読みたい
【よく分かる】xlwingsでExcelを制御しよう by Python PythonからExcelブックに対して、データを読み書きしたり罫線やフォントを設定するライブラリはいくつかありますが、今回は Anaconda に標準搭載されている xlwings 使...
目次

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側にマクロがあって、それを流用したいという場合には非常に便利なので、是非ご活用下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次