他者のPC上で行う業務(Excelのデータ加工)の自動化のため、openpyxl + PyInstallerで自動化ツールを作成するものの起動が遅くてイライラ。かといって、Excel VBAを覚えるのもめんどくさい。もっと楽な方法ないかな~と思っていたら以下の記事を発見。
ExcelからPythonコードを呼び出して使えるとのこと。しかし、どうもうまくいかない。そんなときに以下の記事を発見。
これが上手くいった。
Excelが入っているWindows PCにAnacondaインストール&ちょっと設定して貰えれば、ExcelファイルとPythonファイルを渡すだけで良くなりそう。
なので備忘録にまとめた。
環境
- Windows 10 Home Edition
- PyCharm Community Edition 2019.1.3
- Anaconda 3(xlwings==0.15.8 pywin32==223)
- Excel(Office 365)
ExcelからPythonコードを実行する(やり方)
前述の環境は整っている前提。xlwingsとpywin32はAnacondaとセットでインストールされる。
①Excel マクロ有効ブック(*.xlsm)を作成する
後で作成するPythonコードとExcel マクロ有効ブックは、
1)同じディレクトリにあること
2)ファイル名(拡張子より前)が同一であること
が動作の必要条件。それを考慮したファイル名にすること。
今回はファイル名を「excel_test.xlsm」とした。
②Excel VBEにxlwings.basをインポート
1)Excelを起動し、開発タブの「Visual Basic」をクリックしてVBEを起動
2)VBEのファイル>ファイルのインポートをクリックし、下記パスのファイル(xlwings.bas)を選択、インポート
パス:C:\Users{ユーザー名}\Anaconda3\pkgs\xlwings-{xlwingsのバージョン}-py{Pythonのバージョン}\Lib\site-packages\xlwings\xlwings.bas
インポートが成功していれば、下図のとおり、標準モジュールフォルダに「xlwings」ができる。
③Pythonファイルを作成
前述のとおり、Excel マクロ有効ブックと同じファイル名(拡張子より前)で、同じディレクトリに作成すること。
今回はファイル名を「excel_test.py」とし、コードは下記内容とした。
# coding: utf-8
import xlwings as xw
def copy_add_text():
txt = xw.Range('A1').value
txt += ', I am the Doctor.'
xw.Range('B3').value = txt
④VBEで標準モジュールを追加し、Pythonファイルのメソッドを呼び出すコードを記述
コードの内容は以下のとおり。
1 Option Explicit
2
3 Public Sub copyText()
4 Call RunPython("import excel_test; excel_test.copy_add_text()")
5 End Sub
【補足】
4行目の引数は、"import モジュール名; モジュール名.メソッド名"
とする。
※モジュール名=Pythonファイル名(拡張子不要)
⑤Excelの開発タブ>マクロにメソッドが追加されているので呼び出す
今回のコードは「●●, I am the Doctor.」の●●にA1セルの文字列が代入されたものをB3セルに貼り付けるというもの。
実行結果は下図のとおり。
その他
pywin32==227でwin32apiのインポートエラーが発生。
pywin32==224にしたら解決。
詳細は不明。