Try;
In a module;
Option Explicit
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds 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 Const INFINITE = &HFFFF, SYNCHRONIZE = &H100000
Public Sub RunBatchFiles()
Dim Pid(0 To 3) As Long, hProc As Long, lmsTimeOut As Long
Dim i As Integer
Dim t As Single
lmsTimeOut = INFINITE
t = Timer
Pid(0) = Shell(Environ$("COMSPEC") & " /C " & "c:\mybat0.bat", vbHide)
Pid(1) = Shell(Environ$("COMSPEC") & " /C " & "c:\mybat1.bat", vbHide)
Pid(2) = Shell(Environ$("COMSPEC") & " /C " & "c:\mybat2.bat", vbHide)
Pid(3) = Shell(Environ$("COMSPEC") & " /C " & "c:\mybat3.bat", vbHide)
For i = 1 To UBound(Pid)
hProc = OpenProcess(SYNCHRONIZE, 0&, Pid(i))
If hProc <> 0& Then
WaitForInputIdle hProc, INFINITE
WaitForSingleObject hProc, lmsTimeOut
CloseHandle hProc
End If
Next
MsgBox "Batch files took " & Timer - t & " seconds to run"
End Sub