【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!
外部プログラムの実行と処理待ち(APIを利用した同期処理)|Excel VBA |
外部プログラムを実行するには、Shell関数を使用します。
しかし、ここで問題になるのが、Shell関数は実行中の処理の終了を待たないということです。
次のサンプルは、APIを使用することで、Shell関数で実行した外部プログラムが終了するまで待ちます。
'--- Win32 API 関数の宣言 ---
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'--- Win32 API 定数の宣言 ---
Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Public Const INFINITE As Long = &HFFFF
Sub WaitRun()
Dim TaskId As Long 'タスクID
Dim hProc As Long 'プロセスハンドル
' 外部プログラムの実行
TaskId = Shell("C:\Work\Test.bat", vbMinimizedFocus)
' プロセスハンドルの取得
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, TaskId)
' プロセスハンドルが返されたかを判定
If hProc <> 0 Then
' プロセスのシグナル待ち
Call WaitForSingleObject(hProc, INFINITE)
' プロセスクローズ
CloseHandle hProc
End If
End Sub
WaitForSingleObject関数の第2引数にはタイムアウトの時間をミリ秒単位で指定できます。
このサンプルではINFINITEを指定しているので、処理が終了するまで待ち続けます。
タイムアウトの時間を指定する必要がない場合は、WSHの機能を利用する方法もあります。
WshShell オブジェクトのRunメソッドを使用すると、外部プログラムの実行や、処理の終了を待つかどうかの指定を、より簡単に行うことができます。
WSHを使う方法については、「他アプリを起動する」の「ファイルに関連付けられたアプリケーションを起動する」の項目を参照してください。