■ プロセス終了待機(WaitProcessEnd)

呼び出したアプリケーションが終了するまで処理を待機したいことがあります
アプリケーションを呼び出すには Shell 関数を使用しますが、呼び出したアプリケーションを終了するまで待機するようなオプションはありません
そこで、WaitForSingleObject を使用してプロセスの終了まで待機を行います
WaitForSingleObject で使用するハンドルは、OpenProcess により取得します
普通に使用してしまうと、呼び出し先のアプリケーションの画面を移動するたびに画面内に残像が残ってしまうので、ループ内に DoEvents をいれて、OSに制御を戻すようにします

'******************************************************************************
'*  関数名:プロセス終了待機(WaitProcessEnd)
'*  引 数:コマンドライン(ByVal w_cmdline As String)
'*      起動スタイル(ByVal w_style As VbAppWinStyle)
'*      ロックするフォーム(w_form As Object)
'*  機 能:アプリケーションを起動し終了するまで待機する
'******************************************************************************
Public Sub WaitProcessEnd(ByVal w_cmdline As String, ByVal w_style As _
        VbAppWinStyle, w_form As Object)

Dim w_lret            As Long           ' 呼出アプリケーション終了判定
Dim w_processid       As Double         ' 呼出アプリケーションタスク
Dim hHandle           As Long           ' 呼出アプリケーションハンドル

    ' コマンドラインのアプリケーションを起動する
    w_processid = Shell(w_cmdline, w_style)
    ' フォームをロックする
    w_form.Enabled = False
    ' 起動したアプリケーションのハンドルを取得する
    hHandle = OpenProcess(&H100000, False, w_processid)
    ' ループを開始する
    Do
        ' 指定したアプリケーションの終了または0.1秒経過するまで待機
        w_lret = WaitForSingleObject(hHandle, 100)
        ' 指定したアプリケーションが終了している場合ループを抜ける
        If w_lret = 0 Then Exit Do
        ' OSに制御を戻す
        DoEvents
    ' ループを終了する
    Loop
    ' ハンドルを閉じる
    w_lret = CloseHandle(hHandle)
    ' フォームのロックを解除する
    w_form.Enabled = True
    ' フォームに制御を戻す
    w_form.SetFocus

End Sub