はじめに
最近、Excelマクロの動きが遅いです。Pythonを使えば少しでも計算処理の負担が軽くできるのではないかと思い、やってみることにしました。
今回やってみることは、簡単に説明すると指定のExcelからExcelへコピー貼り付けなど簡単な作業です。データ量が多いのですが。。。では、本題に入ります。
元のVBAの理解
やっていることは、VBAを立ち上げたコード内にある指定のシートの指定のセルにあるパスを読み込む。読み込んだパス先のExcelを開き、マクロ実行するといったものです。
Sub ●●●()
Dim sourceFilePath As String
Dim sourceWB As Workbook
sourceFilePath = Worksheets(“シート名”).Range(“セル”)
set sourceWB = Workbooks.Open(sourceFilePath)
Application.Run “実行したい外部マクロ名”
Call 実行したい内部マクロ名
End Sub
sourceFilePath2
に現在動かしている “シート名” の DN9
セルから取得したファイルパスを代入。
上記で取得したファイルパスから、ブックを開き sourceWB
にセット。
VBA ⇒ Python へ
① Excelアプリの起動
事前に xlwings
ライブラリのインストールとインポートが必要です。
app = xw.App(visible=True)
実行すると以下のようにExcelが起動します。これだけでもうれしい。
visible=Trueの部分において、visible=False
にすると画面には見えないようになります。
② パスを格納した元ファイルを開く
はじめに、パスを設定したファイルを開きます。
main_wb = app.books.open(r‘C:\Users\secon\OneDrive\デスクトップ\財務×会計.xlsm’)
sheet = main_wb.sheets[‘Sheet1’]
source_file_path = sheet.range(‘A1’).value
以下、実行結果です。このような感じで指定のファイル(財務×会計.xlsx)を開くことができました。大変だった。そして、必要ないBookも開かれてしまうのは残念。
▼ チェックポイント①
下のようなコードでは、エラーが出てしまいました。パスは、r’パス’の表現を使用することでエラーを防止することができました。
r'...'
とは、raw文字列(生文字列)リテラルのことであり、python上で発生する意図しない変換を防止する効果があります。
▼ チェックポイント②
たまに、’指定のファイルは開かれています’と表記されることがあります。そのようになり、ファイルが開けないようなときは、タスクマネージャーでExcelのログを消すことで作動します。
③ 外部ファイルを開く
つづいて、先ほど開いたA1セルに記載されているパスのファイルを開いてみます。
source_file_path
に基づいて実際のExcelファイルを開くことができます。ここは、なんなくクリアすることができました。Set sourceWB = Workbooks.Open(sourceFilePath)
④ 外部マクロの実行
以下コードで、開いたファイルのマクロを実行します。こちらもスムーズに実行できました。
app.api.Run(“‘対象ファイル名’!モジュール名.マクロ名”)の構文にて、コードを実行することができます。
※今回の外部マクロはG列をH列へコピーするというものでした。

Application.Run “実行したい外部マクロ名”
例)
Application.Run”‘1日経225先物 先物の過去データ.xlsm’!Module1.Macro1″
⑤ 内部マクロの実行
上記の流れで、以下マクロも実行はできた。しかし、Run Macroの手法ではできず、④まで実行し、その後⑤は単体で実行することで確認できた。
さいごに
今回は、pythonでExcelの処理を高速化するということに挑戦してみた。指定のフォルダにあるExcelを開く。また開いたExcelのセルを参照して、Excelをさらに開きマクロの実行をするまでおこなった。
部分的には活かせるところはあるかもしれない。