VBAでコードを書いていて、
「既にあるツールを実行させて、その結果を使いたいな」
っていうときがありますよね?
(あるんです!)
そんな時に使える、VBAで外部ツールを実行する方法を紹介します。
外部ツールの実行に引数が必要でも大丈夫。
案外簡単に外部ツールを実行することができますよ。
VBAで外部ツールを実行する
今回は、C++で作ったボールの軌道を計算するツールをVBAから実行させてみます。
ボール軌道計算ツールは引数が3つ必要で、
1つ目:ボールの初速
2つ目:ボールを投げる角度
3つ目:時刻の刻み幅
です。
ツール実行する際のコマンドラインは以下のようになります。
ball.exe 10 45 0.05
これは初速10m/s、角度を45度、0.05秒間隔で計算するコマンドです。
これをVBAで実行できるようにしてみました。
まず、Excelのシートに引数として使う値を設定します。
今回はB2~D4セルに設定。
ボタン1をクリックすると処理が走るようにしました。
ではボタン1を押した際のコードがこちら。
Sub RunExe()
Dim obj As Object
Dim cmd As String
Dim fname As String
Dim v0 As Double
Dim angle As Double
Dim dt As Double
'引数にする値を取得
v0 = Cells(2, 2).Value
angle = Cells(3, 2).Value
dt = Cells(4, 2).Value
'カレントディレクトリを変更
ChDir ThisWorkbook.Path
Set obj = CreateObject("WScript.Shell")
'コマンドライン
cmd = "ball.exe " + CStr(v0) + " " + CStr(angle) + " " + CStr(dt)
'実行
obj.Run cmd, 1, True
'出力CSVの名前変更
fname = ThisWorkbook.Path + "\out-ball.csv"
If Dir(fname) <> "" Then
Name fname As ThisWorkbook.Path + "\out-" + CStr(v0) + "-" + CStr(angle) + ".csv"
MsgBox "成功しました"
Else '出力ファイルが無い
MsgBox "実行に失敗しています"
End If
End Sub
このコードの中で、今回大事なのは以下の2行です。
Set obj = CreateObject("WScript.Shell")
obj.Run cmd, 1, True
CreateObjectでWScript.Shellを設定し、そのオブジェクトをRunすることで外部ツールを実行します。
※外部ツールはVBAファイルと同じフォルダにある前提で作っています。
同じフォルダにないなら、しっかりパスも指定してください。
Runで設定しているのは、
obj.Run コマンドライン, コマンドプロンプトの表示/非表示, 同期/非同期
です。
コマンドラインは実行したいツール名やその引数を入れます。
コマンドプロンプトの表示/非表示は、
0:非表示
1:表示
で指定します。
同期/非同期は
True:同期(ツールの実行が終わるまでVBAの処理を待つ)
False:非同期(ツールの処理を待たずに続きを実行する)
を指定します。
なお、ボール軌道計算ツールは位置・速度を”out-ball.csv”というファイル名で出力します。
今回はVBAでファイル名を変換する処理も入れてみました。
Name 変更前ファイル名 As 変更後ファイル名
でファイル名を変換します。
試作プログラムの実行結果
ボール軌道計算ツールを実行するコードを、入力の角度を変えて3回実行してみました。
出力されたファイルは
しっかりファイル名が変換されています。
出力ファイルをプロットしてみると
ちゃんとデータが出力できていますね。
VBAで外部ツールを実行できました!
ちなみに、VBAでグラフを作る方法は以下の記事にまとめています。
今回は外部ツールが簡単な処理を行うものでしたが、本来はもっと複雑な処理を外部ツールにさせて、VBAはその結果をプロットしたり、集計したりすることが多いです。
VBAはいろいろできて楽しいですね。
んじゃ、また~
コメント