Excel VBAで外部アプリを起動し終了まで待つ方法

kt1516

2018年08月31日 16:34


Excel VBAで外部アプリを起動するにはExcel VBAからUWSCを起動する方法の記事でも紹介しましたが、Shell関数を使う方法があります。ただ、この方法だと外部アプリが終了するまで待つことができないので不都合な時があります。

例えば、Excelのセルからデータを渡してUWSCを起動し、UWSCでなんらかの処理をさせて、それをExcel側に反映させたいとします。

Excelのシートは下の状態だとします。⇓


下のtest1プロシージャのようにShell関数を使う方法だと、UWSC側の処理を待たないのでエラーになってしまいます。⇓

'Excel VBAのコード
'A列の数値をtest.uwsに渡してUWSCを起動する
'UWSC.exeとtest.uwsはドキュメントフォルダにあるとする
Sub test1()
Dim myDocuments As String
Dim WSH As Variant
Set WSH = CreateObject("WScript.Shell")
myDocuments = WSH.SpecialFolders("MyDocuments") & "\"

Dim uwscPath As String
Dim filePath As String
Dim args As String

'UWSC.exeのパス
uwscPath = myDocuments & "UWSC.exe"

'起動させたいUWSCのファイルのパス
filePath = myDocuments & "test.uws"

Dim i As Integer
Dim lastrow As Integer
lastrow = Cells(1, 1).End(xlDown).Row

For i = 1 To lastrow
'UWSCに渡す引数
args = Cells(i, 1) & " " & i

Dim ret As Variant
'ファイル名とUWSCに渡す引数を渡してUWSCを起動する
ret = Shell(uwscPath & " " & filePath & " " & args, vbNormalFocus)
Next

MsgBox ("終了しました。")
End Sub

//test.uwsのコード
//受け取った数値に2を掛けて、ExcelのB列に値を設定(この処理自体には意味はありません。)
double = PARAM_STR[0] * 2
EXCEL= getactiveoleobj("Excel.Application")
Excel.cells(PARAM_STR[1], 2) = double


test1プロシージャを実行すると、COMエラーが発生。⇓


このようなとき、次のようにすると外部アプリの終了まで待つので意図したとおりにプログラムを実行できます。⇓

'Excel VBAのコード
'A列の数値をtest.uwsに渡してUWSCを起動する
'UWSC.exeとtest.uwsはドキュメントフォルダにあるとする
Sub test2()
Dim myDocuments As String
Dim WSH As Variant
Set WSH = CreateObject("WScript.Shell")
myDocuments = WSH.SpecialFolders("MyDocuments") & "\"

Dim uwscPath As String
Dim filePath As String
Dim args As String

'UWSC.exeのパス
uwscPath = myDocuments & "UWSC\UWSC.exe"

'起動させたいUWSCのファイルのパス
filePath = myDocuments & "UWSC\test.uws"

Dim i As Integer
Dim lastrow As Integer
lastrow = Cells(1, 1).End(xlDown).Row

For i = 1 To lastrow
'UWSCに渡す引数
args = Cells(i, 1) & " " & i

'ファイル名とUWSCに渡す引数を渡してUWSCを起動、終了まで待つ
WSH.Run uwscPath & " " & filePath & " " & args, , True
Next

MsgBox ("終了しました。")
End Sub

test2プロシージャを実行すると、下のようになります。⇓



関連記事