Pythonとxlwingsを使用してExcel VBAマクロを実行する方法について説明します。この方法は、既存のVBA資産を活かしつつ、Pythonで快適にコーディングできるようになります。
環境
以下の環境で試しています。
- OS: Windows 10 version 1909
- Python: version 3.7.5
- xlwings: version 0.18.0
- エディター: VSCode version 1.45.1 & Python拡張機能 version 2020.5.80290
基本的な使い方
公式ドキュメント(Python API)を参考に、PythonからExcel VBAマクロを呼び出してみましょう。
import xlwings as xw
wb = xw.Book('VBA_example.xlsm') # 2. ブックを開く
macro = wb.macro('hello_VBA') # 3. マクロを取得
macro() # 4. マクロを実行
このコードは以下のように動作します。
- xlwingsをインポートします。
- 同じフォルダーにあるブックを開きます。
- ブック内のマクロ
hello_VBA
を変数macro
に格納します。 macro
を実行します。
応用(VBAマクロの連続実行)
あるExcelファイルのボタンから、他のExcelファイルのVBAマクロを連続で実行できるようにしてみます。
import os
from pathlib import Path
import numpy as np
import pandas as pd
import xlwings as xw
os.chdir(Path(__file__).parent.absolute().resolve())
@xw.sub
@xw.arg('df_target', pd.DataFrame, index=False, header=True)
def call_vba(df_target: pd.DataFrame):
def call_vba_single(row):
#設定読み込み
wb_path, wb_name, macro_name = row['フォルダー'], row['ファイル'], row['マクロ']
#マクロ実行用Excelインスタンス生成し、ブックを開く
app = xw.apps.add()
xl_path = (Path() / wb_path / wb_name).resolve()
wb = app.books.open(str(xl_path))
#マクロ実行
app.display_alerts = False
macro = wb.macro(macro_name)
macro()
app.display_alerts = True
#ブックを閉じる
wb.close()
#Excelインスタンスを閉じる
app.quit()
df_target.apply(call_vba_single, axis=1)
このPythonスクリプトは、Excelファイルのボタンから、他のExcelファイルのVBAマクロを連続で実行できるようにします。
以上がPythonとxlwingsを使用してExcel VBAマクロを実行する方法についての説明です。この方法を使用すれば、PythonからExcelマクロを呼び出す際、任意の数だけ引数を指定できますので、汎用的な処理が実現可能です。既にExcel側にマクロがあって、それを流用したいという場合には非常に便利なので、是非ご活用下さい。