No Programming, No Life

プログラミング関連の話題や雑記

VBAのマクロで外部コマンドを呼び出すサンプル

はじめに

諸事情があり、Excelのマクロから外部コマンドを呼び出す必要がありました。その際書いたスクリプトのメモです。

動作環境

Win10 × Excel2016でしか動作確認しています。

サンプルコード

Dim wsh As Object
Dim exec As Object
Dim command As String
Dim result As String

Set wsh = CreateObject("WScript.Shell")
command = "〜〜〜"
Set exec = wsh.exec("%ComSpec% /c " & command)

Dim line As String
' ★★★ポイント1★★★
Do While exec.Status = 0
    If Not exec.StdOut.AtEndOfStream Then
        line = exec.StdOut.ReadLine ' 標準出力の1行読み込み
        ' 〜〜〜(処理)〜〜〜
        Do Events
    End If
Loop

' ★★★ポイント2★★★
Do Until exec.StdOut.AtEndOfStream
    line = exec.StdOut.ReadLine ' 標準出力の1行読み込み
    ' 〜〜〜(処理)〜〜〜
    Do Events
Loop

Set exec = Nothing
Set wsh = Nothing

ポイント1

exec.Status0 になるまで待ち合わせを行っています。wsh#exec した後はコマンド実行が終わるまで時間がかかるかもしれないためです。ちなみにこの位置で標準出力のストリームを読み込んで置かないと、データ量が多いとふんずまるみたいです。

ポイント2

ここは、残りの標準出力のストリームを最後まで読み込んでいる部分です。

同じ処理を2箇所で書かていてカッコ悪いので、実用的なコードを書くときはちゃんと関数化などしましょう。

おわり。

参考サイト

https://m.srad.jp/~IR.0-4/journal/572274