\

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. マクロを実行

このコードは以下のように動作します。

  1. xlwingsをインポートします。
  2. 同じフォルダーにあるブックを開きます。
  3. ブック内のマクロ hello_VBA を変数 macro に格納します。
  4. 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側にマクロがあって、それを流用したいという場合には非常に便利なので、是非ご活用下さい。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です