自分基準

自分の思ったことを気ままにメモ代わりに書いていこうかと

VBAからPythonを動かす

久しぶりのメモ

ここ最近、Pythonを使うことが多かったがどうしてもエクセルからpythonを動かしたいことができたのでしばらく試行錯誤し、ようやく実行できたのでそのメモ

必要なもの

Python
Excel
・xlwings
・pywin32

上2つは当たり前なので置いておくとして、下のxlwingspywin32だが、xlwingsはPythonのモジュールの1つでこれをインポートすることでExcelpythonが相互に動かせるようになる。 もう一つのpywin32もモジュールの1つでwin32paiを動作するのに必要。

xlwingsのインストール

xlwingsのインストールは簡単でコマンドプロンプト上で

pip install xlwings

と入力したら終わり。

成功したかは画面を見たらおそらく分かるが、不安であればpythonコマンドプロンプトで対話型で起動し

import xlwings

と入力し、問題なく次に進めば、とりあえず成功しているはずである。

Z:\Users\xxx\Desktop>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import xlwings
>>>

f:id:nisiki_satika:20160603175911p:plain

pywin32のインストール

こちらはpipからのインストールではなくインストーラから行った。

https://pypi.python.org/pypi/pywin32

まず、上記リンクのDownload URLからファイルのあるページに飛び

f:id:nisiki_satika:20160603180606p:plain

Buildの一覧の中からインストールしたいバージョンを選ぶが、特に問題はないと思うので自分は最新の220を選択した。

f:id:nisiki_satika:20160603180821p:plain

続いて、Buildのページから自分のインストールしてあるPythonのバージョン、bit等に合わせてインストーラを落とす。自分は(確か)64bitでバージョンが3.4なので該当しているのを選んだ。

f:id:nisiki_satika:20160603181129p:plain

インストーラをダウンロードしたら通常通り、実行しインストールをしていけば問題はないと思うのでここは省略し、インストールに成功したかの確認だがxlwingsと同様に対話型のPython上で

import win32

と入力してみてエラーが無ければとりあえず、こちらも成功のはず。

Z:\Users\owner\Desktop\Stock\code>python
Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32
>>>

f:id:nisiki_satika:20160603181602p:plain

pythonコードとExcelの用意

ようやく、ここから実際のプログラムを実行させる。 最初にVBAから実行させたいPythonのコードを用意する。 とりあえず、まずテスト用にExcelセルのA1の文字を取得し、B2に出力するだけのプログラムにする。ファイル名はVBA_Test.pyとした。

from xlwings import Workbook, Range

def testfunc():
    wb = Workbook.caller()
    gc = Range("A1").value
    Range('B2').value = gc

次にExcelを用意するが、必ずPythonと同じフォルダに有ることが条件である違うフォルダにあると実行時にエラーがでるので忘れずに同じフォルダに置く。 私はPythonのコードは保存したがExcelをどこにも保存せずに実行したので何度もエラーになり躓いたので注意が必要である。

Excelの準備(マクロの有効化)

※ここではマクロの有効化の説明だけなので、コード等は下のモジュールのインポートから

Excel側の準備だが、まずExcelにxlwingsのモジュールをインポートする必要があるが、そのためにはVBAのコードを書くbookを開くが通常のExcelの設定ではマクロ等が無効になっているので有効化する必要がある。

有効化の手順は左上の[ファイル]→[オプション]→[リボンのユーザー設定]→[メイン タブ]の[開発] にチェックを入れる。

f:id:nisiki_satika:20160603183531p:plain

f:id:nisiki_satika:20160603183542p:plain

f:id:nisiki_satika:20160603183549p:plain

モジュールのインポート

次にxlwingsのインポートだが、Alt + F11を押してVBAのコードを入手する画面を出したら、ツールバーの[ファイル(F)]の[ファイルのインポート]を選びxlwings.basをインポートする必要がある。 ファイルの場所は通常通りであればC:\Python34\Lib\site-packages\xlwingsの中にあると思われる。(少なくとも私はここにあった)

f:id:nisiki_satika:20160603184830p:plain

f:id:nisiki_satika:20160603184838p:plain

インポートが行われると左側のプロジェクト-VBAProjectの中に標準モジュールができ、中にxlwingsが入っている。

f:id:nisiki_satika:20160603184858p:plain

f:id:nisiki_satika:20160603192604p:plain

これで設定は終わりで、次はVBAコードになる。

VBAのコード

私はまだ、VBAを詳しく知らないのでとりあえずPythonを実行するだけのコードを載せる。 Sheet1(Sheet1)をダブルクリックしたらコードを書く欄が出てくるのでそこに以下を書いた。

Sub TestPy()
    RunPython ("import VBA_Test;VBA_Test.testfunc()")
End Sub

RunPythonで中をimport Pythonのコード名;もう一度コード名.関数名で実行される。 セルのA1からB2へ内容がコピーされるコードなので、A1に適当な文字でも書いておく。

f:id:nisiki_satika:20160603185954p:plain

実行の方法は、コードを書く欄の少し上にあるビテオ等の再生みたいた緑色の三角F5で実行される。

f:id:nisiki_satika:20160603190034p:plain

実行すると、どのマクロを実行するのか聞かれるので、自分の書いたマクロを選び実行をクリックする。

f:id:nisiki_satika:20160603190221p:plain

すると下記のようになり、成功した。

f:id:nisiki_satika:20160603191252p:plain

今のところはこのくらいの事しかできないが、とりあえずExcelからPythonを実行するとができたので良しとする。 今後の自分に期待。