VBAでPython(pyファイル)を実行する方法

今回はVBAでPythonを実行する方法を紹介していきます。
「VBAでPythonを実行」というと、このVBAが指すのはほとんどの場合Excel VBAでしょう。

ただ、作業内容によってはExcel以外のVBAでPythonと連携したいという場面が出てくると思います。

というわけで本ページではExcel VBAだけでなくAccessやPowerPoint、当サイトで主に扱っているCATIAなどのソフトのVBAからでも可能なPythonの実行方法を解説していきます。

機械学習[ディープラーニング]を行うことに長けたプログラミング言語であるPythonと連携するということは、作成しているVBAマクロに人口知能[AI]の力を盛り込むことが可能になるということです。(もちろんディープラーニングについても学ぶ必要はありますが)

ここでVBAとPythonの連携方法を学び、より幅広いマクロを作れるようになりましょう。

 icon-warning 注意  

※本ページはWindowsにPython環境が構築されていることを前提に進めていきます。
 Pythonが導入されていないと本ページのコードは実行できないので注意して下さい。

 

コマンドプロンプトからPythonを実行

Windowsにはコマンドプロンプトという機能が標準装備されています。
このコマンドプロンプトは実行したいファイルのフルパスを入力することで、そのファイルを実行することができます。

そしてVBAにはコマンドプロンプトを操作することのできる『WshShellオブジェクト』というものが用意されています。

つまり、VBAとPythonの間にコマンドプロンプトを噛ませれば、どのソフトのVBAからでもPythonを実行することができるという訳です。

 icon-edit tips 外部ファイルの実行 ここでは「Pythonを実行」といっていますが、処理の内容としてはVBAでコマンドプロンプトを操作しているだけなので、コマンドプロンプトから実行可能なファイル(いわゆる外部ファイル)は全て実行可能です。

 

WshShellオブジェクトの設定

『WshShellオブジェクト』はVBAデフォルト設定のままでは使うことができません。
ということで、まずは以下のとおりライブラリを追加しましょう。

1. VBE(Visual Basic Editor)の[ツール]タブから[参照設定]を選択

2.「Windows Script Host Object Model」にチェックして[OK]をクリック

  
これで『WshShellオブジェクト』が使用可能になりました。

あとはVBA上で以下のように書けばWshShellオブジェクトを使うことができます。

icon-code WshShellオブジェクトの定義

Dim wsh As WshShell
Set wsh = CreateObject(“WScript.Shell”)

 

ExecメソッドとRunメソッド

「コマンドプロンプトでファイルを実行」という操作はWshShellオブジェクトの『Execメソッド』もしくは『Runメソッド』で行うことが出来ます。

icon-code Execメソッド

Dim cmd_str As String
cmd_str = “python C:\Users\ユーザー名\Desktop\sample.py “
  
Call wsh.Exec(cmd_str)

icon-code Runメソッド

Dim cmd_str As String
cmd_str = “python C:\Users\ユーザー名\Desktop\sample.py “
 
Call wsh.Run(cmd_str ,0 ,True) ‘パス ,ウィンドウスタイル ,終了待ち

それぞれのメソッドを使うには上記のように書きます。
cmd_str には「実行したいファイルのフルパス」を入力します。
pyファイルの場合はフルパスの前に「python 」と書いておく必要があるので注意しましょう。
(上記コードの場合、デスクトップにあるsample.pyというファイルが実行されます)

Runメソッドにはcmd_str以外にも引数がありますが、今回の内容にはあまり関係ないため説明は省略します。(詳しくは「WshShell Run」等で検索してみて下さい)

 
両メソッドにはデータの取り扱い方などに違いがありますが、今回の「pyファイルの実行」という点においてはどちらを使っても問題ありません。
ただコマンドプロンプトの表示状態は目に見えてわかる違いなので任意で好きな方を選びましょう。

Execメソッド:実行時にコマンドプロンプトが表示される
Runメソッド:実行時にコマンドプロンプトが表示されない

 

引数の設定

コマンドプロンプトでは任意で引数を設定することができます。
たとえばVBAで「X=10」「Y=3.14」「Z=”abc”」というような変数を作成した場合、それぞれの変数の値をpyファイルに渡すことができます。

これによりVBAではできないような高度な計算処理をPythonで行うことが可能になります。

引数を設定するには上記で設定した『cmd_str』の後ろにそれぞれの変数名を入力するだけです。

icon-code 引数の設定 

Dim cmd_str As String
cmd_str
= python C:\Users\ユーザー名\Desktop\sample.py ” & ” ” & X & ” ” & Y & ” ” & Z

このとき注意しないといけないのは各変数の間に空白スぺースを入れる必要があるという点です。
最終的に上記のように「python フルパス X Y Z」というような文字列ができればOKです。

あとはこの『cmd_str』を『Execメソッド』『Runメソッド』で実行するだけです。

 

pyファイル実行コード

上記の内容をまとめ少し体裁を整えると以下のようなコードができあがります。
以下のコードの「py_file」に実行したいpyファイルのフルパスを入れれば完成です。

後はこのコードを実行すれば指定したpyファイルを実行することができます。

 

 サンプルマクロ

ここまでやってきな内容をさらに具体的に理解するためサンプルマクロを用意しました。
マクロの内容は非常にシンプルでPythonコードでメッセージボックスを表示させるだけのものです。

またメッセージボックスの内容は引数をつかってVBAで指定した値を表示するようにします。
これにより、どのようにしてVBAからPythonに値を渡しているかのイメージが付くと思います。

このマクロはVBAのMsgBox関数で全く同じことがもっと簡単にできますが、ここではPythonとの連携のイメージをつかみやすくするためこのような内容になっています。

 

pyファイル準備

まずpyファイル(Pythonのコード)を作成します。
メモ帳を開き、以下のコードをコピペして保存します。(保存場所はどこでもOK)

保存したら拡張子を「◯◯◯.txt」から「◯◯◯.py」に変更します。
Pythonが導入できていれば以下のようにPython Fileとして認識されます。

これでPython側の準備は完了です。
 

VBAコード作成

つぎにコマンドプロンプトを使って先ほど用意したpyファイルを実行するという処理をVBAで書いていきます。これはどのVBAでも共通の内容なので、どのソフトのVBAからでも実行可能です。

モジュールを1つ作成し以下のコードをコピペして下さい。
※py_fileには先ほど作成したpyファイルのフルパスを入れて下さい。

 
これでVBAコードの準備も完了しました。
あとはこのマクロ(モジュール)を実行すれば、先ほどのpyファイルもあわせて実行されます。

以下のようなメッセージボックスが表示されれば成功です。
VBAで入力したX,Yの値がpyファイルにしっかりと受け渡されていることも確認できます。

コマンドプロンプトを表示させたくない場合は先に説明した『Runメソッド』を使えばOKです。

 

コード解説

ここではpyファイルのコード内容を簡単に解説しておきます。
(※VBAコードは先に説明しているので省略します)

サンプルコードの処理の内容を簡単にまとめると以下のようになっています。

1. sys.argvを使ってコマンドライン引数(ファイル実行時に渡すことのできる引数のこと)を定義
2. str(argv[1])でXに第一引数を文字列として代入
3. str(argv[2])でYに第二引数を文字列として代入
4. 2,3で取得したX、Yを使って文字列作成 [msg]
5. 4で作成した文字列を使いメッセージボックスを表示 [messagebox.showinfo(title, msg)]

 

上記の処理の中で1番重要な部分は引数を受け取る部分の処理(1,2,3)です。
コードでいうと以下の部分です。

icon-code 引数の受け取り[Python] 

import sys
argv = sys.argv    #コマンドライン引数を扱うための変数argvを定義
X = str(argv[1])    #第一引数を文字列としてXに代入
Y = str(argv[2])    #第二引数を文字列としてYに代入

「argv = sys.argv」によりVBAで設定した引数がリストとして格納されていきます。
argv[1]とすれば第一引数を、argv[2]とすれば第二引数をそれぞれ表すことができます。

今回のマクロでは最終的にメッセージボックスで引数の値を表示するので、この時点で文字列型に変換してPython側の変数である「X」「Y」に代入しています。

 icon-edit Pythonの文字表示 今回はメッセージボックスで表示ということでX、Yはともにstr()を使って文字列として代入しています。
Pythonでは何か文字として表示する際に文字列として変換する必要があります。
文字表示に関する変数はすべて文字列型にしないとエラーが発生するので注意しましょう。
(今回のmessageboxやprint()など)

 

まとめ

いろいろ書いてきましたが今回の内容をまとめると以下のとおりです。

VBAでPythonを実行するにはコマンドプロンプトを間に噛ませる
VBAでコマンドプロンプトを操作するには『WshShellオブジェクト』を使う
ファイル実行はWshShellオブジェクトの『Execメソッド』『Runメソッド』を使う
引数を設定した場合はpyファイル側で値を受け取るコードを書く必要がある
Pythonで引数を受け取るには『sys.argv』を使う

今回は簡単なマクロを例にしたのでイメージはつかむことができたと思います。

VBAとPythonを連携させることでVBAだけでは無理だった様々なことが実現可能になります。
冒頭でも紹介したディープラーニングをはじめとしたAI技術、Webスクレイピングのようなインターネットを介したデータ収集などPythonから多くの恩恵が受けられるのでいろいろ組み合わせて試してみて下さい。

Python, VBA

Posted by Lic