はじめに
VBAで外部アプリケーションを実行する方法として、主にShell関数を利用することが多いですが、Shell関数では外部アプリケーションの標準出力結果を得ることができません。
そこで、今回はWScriptを利用し、コンソールアプリケーション(.exe)で出力された標準出力結果を取得する方法の備忘録です。
サンプルコード
Sub Sample()
Dim objc
Dim objExec
Dim cmd
Dim result
Set objc = CreateObject("WScript.Shell")
cmd = "Sample.exe Arg1"
Set objExec = objc.Exec("%ComSpec% /c" & cmd)
'処理完了までループ処理
Do While objExec.Status = 0
DoEvents
Loop
' StdOut が標準出力ストリームを提供
result = objExec.StdOut.ReadAll
' 標準出力結果を出力
Debug.Print result
End Sub
%ComSpec% 環境変数はコマンドインタープリター(cmd.exe)のパスをもつ環境変数です。
$ echo %ComSpec%
C:¥WINDOWS¥system32¥cmd.exe
objExec.Status が「0」の場合ループを続けますが、このStatusプロパティの値が「0」の場合は “起動したプログラムが実行中” を指します。
最後に
Excelは何かと使うツールの一つで、VBAを使えばより仕事の幅が広がります。
今回は Excelを飛び越えて外部アプリケーションまで利用していますが、参考になれば幸いです。