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の連携方法を学び、より幅広いマクロを作れるようになりましょう。
※本ページはWindowsにPython環境が構築されていることを前提に進めていきます。
Pythonが導入されていないと本ページのコードは実行できないので注意して下さい。
また、本ページの内容を行うにはPythonの環境変数PATHを設定しておく必要があります。
これが設定されていないとpyファイルの実行ができないので注意しましょう。
今回の方法ではVBAからPythonに値を渡すことはできますが、PythonからVBAに値を渡すことはできません。双方向に値を受け渡す方法は別ページで紹介しているためそちらもあわせてご覧ください。
サブスクでプログラミング学習してみよう!
Pythonをはじめいくつものプログラミング言語の学習が可能!
通常なら月10,000円以上はかかるプログラミング学習が約3000円という国内屈指の安さ!
サブスク型なのでいつでも始められて、いつでも辞められるという気軽さ!
▼▼▼ 詳しくは下バナーをクリック ▼▼▼
コマンドプロンプトからPythonを実行
Windowsにはコマンドプロンプトという機能が標準装備されています。
このコマンドプロンプトは実行したいファイルのフルパスを入力することで、そのファイルを実行することができます。
そしてVBAにはコマンドプロンプトを操作することのできる『WshShellオブジェクト』というものが用意されています。
つまり、VBAとPythonの間にコマンドプロンプトを噛ませれば、どのソフトのVBAからでもPythonを実行することができるという訳です。
WshShellオブジェクトの設定
『WshShellオブジェクト』はVBAデフォルト設定のままでは使うことができません。
ということで、まずは以下のとおりライブラリを追加しましょう。
これで『WshShellオブジェクト』が使用可能になりました。
別方法としてVBA上で以下のように書くことでもWshShellオブジェクトを使うことができます。
サンプルコードでは下記コードを使用しますが参照設定をしていても問題ありません。
Dim wsh As WshShell
Set wsh = CreateObject(“WScript.Shell”)
ExecメソッドとRunメソッド
「コマンドプロンプトでファイルを実行」という操作はWshShellオブジェクトの『Execメソッド』もしくは『Runメソッド』で行うことが出来ます。
Dim cmd_str As String
cmd_str = “python C:\Users\ユーザー名\Desktop\sample.py “
Call wsh.Exec(cmd_str)
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』の後ろにそれぞれの変数名を入力するだけです。
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ファイルのフルパスを入れれば完成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Option Explicit Sub Run_Python() Dim wsh As WshShell Set wsh = CreateObject("WScript.Shell") Dim py_file As String py_file = "C:\Users\ユーザー名\Desktop\sample.py " '実行したいpyファイルのフルパス Dim cmd_str As String cmd_str = "python " & py_file Call wsh.Exec(cmd_str) End Sub |
後はこのコードを実行すれば指定したpyファイルを実行することができます。
サンプルマクロ
ここまでやってきな内容をさらに具体的に理解するためサンプルマクロを用意しました。
マクロの内容は非常にシンプルでPythonコードでメッセージボックスを表示させるだけのものです。
またメッセージボックスの内容は引数をつかってVBAで指定した値を表示するようにします。
これにより、どのようにしてVBAからPythonに値を渡しているかのイメージが付くと思います。
このマクロはVBAのMsgBox関数で全く同じことがもっと簡単にできますが、ここではPythonとの連携のイメージをつかみやすくするためこのような内容になっています。
pyファイル準備
まずpyファイル(Pythonのコード)を作成します。
メモ帳を開き、以下のコードをコピペして保存します。(保存場所はどこでもOK)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import tkinter as tk from tkinter import messagebox import sys def msgbox(X,Y): root = tk.Tk() root.withdraw() title = "実行確認" msg = "X : " + X + "\n" + "Y : " + Y messagebox.showinfo(title, msg) if __name__ == "__main__": argv = sys.argv #コマンドライン引数を扱うための変数argvを定義 X = str(argv[1]) #第一引数を文字列としてXに代入 Y = str(argv[2]) #第二引数を文字列としてYに代入 msgbox(X,Y) |
保存したら拡張子を「◯◯◯.txt」から「◯◯◯.py」に変更します。
Pythonが導入できていれば以下のようにPython Fileとして認識されます。
これでPython側の準備は完了です。
VBAコード作成
つぎにコマンドプロンプトを使って先ほど用意したpyファイルを実行するという処理をVBAで書いていきます。これはどのVBAでも共通の内容なので、どのソフトのVBAからでも実行可能です。
モジュールを1つ作成し以下のコードをコピペして下さい。
※py_fileには先ほど作成したpyファイルのフルパスを入れて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Option Explicit Sub Run_Python() Dim wsh As WshShell Set wsh = CreateObject("WScript.Shell") Dim py_file As String py_file = "C:\Users\ユーザー名\Desktop\sample.py " 'pyファイル フルパス Dim X As String Dim Y As Integer X = "Hello" Y = 100 Dim cmd_str As String cmd_str = "python " & py_file & " " & X & " " & Y '実行コードの作成 '第一引数に「X」第二引数に「Y」を設定 Call wsh.Exec(cmd_str) End Sub |
これでVBAコードの準備も完了しました。
あとはこのマクロ(モジュール)を実行すれば、先ほどのpyファイルもあわせて実行されます。
以下のようなメッセージボックスが表示されれば成功です。
VBAで入力したX,Yの値がpyファイルにしっかりと受け渡されていることも確認できます。
コマンドプロンプトを表示させたくない場合は先に説明した『Runメソッド』を使えばOKです。
コード解説
ここではpyファイルのコード内容を簡単に解説しておきます。
(※VBAコードは先に説明しているので省略します)
サンプルコードの処理の内容を簡単にまとめると以下のようになっています。
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)です。
コードでいうと以下の部分です。
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」に代入しています。
Pythonでは何か文字として表示する際に文字列として変換する必要があります。
文字表示に関する変数はすべて文字列型にしないとエラーが発生するので注意しましょう。
(今回のmessageboxやprint()など)
まとめ
いろいろ書いてきましたが今回の内容をまとめると以下のとおりです。
VBAでPythonを実行するにはコマンドプロンプトを間に噛ませる
VBAでコマンドプロンプトを操作するには『WshShellオブジェクト』を使う
ファイル実行はWshShellオブジェクトの『Execメソッド』『Runメソッド』を使う
引数を設定した場合はpyファイル側で値を受け取るコードを書く必要がある
Pythonで引数を受け取るには『sys.argv』を使う
今回は簡単なマクロを例にしたのでイメージはつかむことができたと思います。
VBAとPythonを連携させることでVBAだけでは無理だった様々なことが実現可能になります。
冒頭でも紹介したディープラーニングをはじめとしたAI技術、Webスクレイピングのようなインターネットを介したデータ収集などPythonから多くの恩恵が受けられるのでいろいろ組み合わせて試してみて下さい。
また、今回の方法ではVBAからPythonに値を渡すことはできますが、PythonからVBAには渡すことができません。今回の内容をすこし改良して、どちらからでも値を受け渡せるようにしたコードを作成したのでそちらも参考にしてみてください。
サブスクでプログラミング学習してみよう!
Pythonをはじめいくつものプログラミング言語の学習が可能!
通常なら月10,000円以上はかかるプログラミング学習が約3000円という国内屈指の安さ!
サブスク型なのでいつでも始められて、いつでも辞められるという気軽さ!
▼▼▼ 詳しくは下バナーをクリック ▼▼▼