Da dichiarare in un modulo:

codice:
 
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Const INFINITE = &HFFFF      '  Timeout infinito
Public Const SYNCHRONIZE = &H100000

Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
lancio una applicazione e attendo che finisca l'esecuzione:
codice:
 
Dim process_handle As Long
Dim process_id As Long

        process_id = Shell(AppDaEseguire, vbNormalFocus)
        DoEvents
        process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
        If process_handle <> 0 Then
            WaitForSingleObject process_handle, INFINITE
            CloseHandle process_handle
        End If