PythonでExcelマクロを高速化1

目次

はじめに

最近、Excelマクロの動きが遅いです。Pythonを使えば少しでも計算処理の負担が軽くできるのではないかと思い、やってみることにしました。
今回やってみることは、簡単に説明すると指定のExcelからExcelへコピー貼り付けなど簡単な作業です。データ量が多いのですが。。。では、本題に入ります。


元のVBAの理解

やっていることは、VBAを立ち上げたコード内にある指定のシートの指定のセルにあるパスを読み込む。読み込んだパス先のExcelを開き、マクロ実行するといったものです。

sample code(vba)

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 ライブラリのインストールとインポートが必要です。

sample code(python)
import xlwings asxw
app = xw.App(visible=True)

実行すると以下のようにExcelが起動します。これだけでもうれしい。

visible=Trueの部分において、visible=False にすると画面には見えないようになります。


② パスを格納した元ファイルを開く

はじめに、パスを設定したファイルを開きます。

sample code(python)

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セルに記載されているパスのファイルを開いてみます。

sample code(python)
source_wb=app.books.open(source_file_path)
source_file_path に基づいて実際のExcelファイルを開くことができます。ここは、なんなくクリアすることができました。
ちなみに、VBAでは以下のようなコードとなります。非常にシンプルなコードですね。
sample code(vba)

Set sourceWB = Workbooks.Open(sourceFilePath)


④ 外部マクロの実行

以下コードで、開いたファイルのマクロを実行します。こちらもスムーズに実行できました。
app.api.Run(“‘対象ファイル名’!モジュール名.マクロ名”)の構文にて、コードを実行することができます。
※今回の外部マクロはG列をH列へコピーするというものでした。

sample code(python)
app.api.Run(“‘1日経225先物 先物の過去データ.xlsm’!Module1.Macro1″)
ちなみに、VBAでは以下のようなコードになります。
sample code(vba)

Application.Run “実行したい外部マクロ名”
例)
Application.Run”‘1日経225先物 先物の過去データ.xlsm’!Module1.Macro1″


⑤ 内部マクロの実行

上記の流れで、以下マクロも実行はできた。しかし、Run Macroの手法ではできず、④まで実行し、その後⑤は単体で実行することで確認できた。

sample code(python)
main_wb.macro(‘Module1.Macro1’)()

さいごに

今回は、pythonでExcelの処理を高速化するということに挑戦してみた。指定のフォルダにあるExcelを開く。また開いたExcelのセルを参照して、Excelをさらに開きマクロの実行をするまでおこなった。

部分的には活かせるところはあるかもしれない。

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