Coloque isso em um módulo:
Public Const WAIT_FAILED = &HFFFFFFFF
Public Const WAIT_OBJECT_0 = &H0&
Public Const WAIT_ABANDONED = &H80&
Public Const WAIT_TIMEOUT = &H102&
Public Const STANDARD_RIGHTS_ALL = &H1F0000
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 Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public IDProcesso As Long
Public Processo As Long
Public RetornoProcesso As Long
Para chamar o executável
IDProcesso = Shell("c:windowscalc.exe", vbNormalFocus)
Processo = OpenProcess(STANDARD_RIGHTS_ALL, False, IDProcesso)
agora coloque isso num timer com o intervalo setado para 40(40 mesmo, não 40 segundos)
RetornoProcesso = WaitForSingleObject(Processo, 10)
Select Case RetornoProcesso
Case WAIT_TIMEOUT
DoEvents
Case WAIT_FAILED Or WAIT_ABANDONED
Exit Sub
Case WAIT_OBJECT_0
MsgBox "Programa foi fechado"
Call CloseHandle(Processo) 'Close the process handle
Call CloseHandle(IDProcesso) 'Close the process id handle
Exit Sub
End Select
DoEvents