HOME > 即効テクニック > Excel VBA > その他関連のテクニック > 外部プログラムの実行と処理待ち(APIを利用した同期処理)

外部プログラムの実行と処理待ち(APIを利用した同期処理)|Excel VBA

その他関連のテクニック

外部プログラムの実行と処理待ち(APIを利用した同期処理)

(Excel 2000/2002/2003/2007/2010) 

外部プログラムを実行するには、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を使う方法については、「他アプリを起動する」の「ファイルに関連付けられたアプリケーションを起動する」の項目を参照してください。