Pues nada, que el Visual Basic está muy bien para programar aplicaciones sencillas rápidamente, pero aparte de eso tiene un millón de carencias como por ejemplo no pararse a esperar a que termine la ejecución de un programa invocado externamente mediante la instrucción Shell :

Shell("gzip.exe backup.sql")

Mi intención era crear un programa q hiciese un backup SQL de una base de datos Access, lo comprimiese y lo enviase vía FTP a un servidor remoto. El problema es q con Visual Basic si lo mandas comprimir y utilizas una aplicación externa como gzip lo q sucede es q no se espera a q termine la compresión y ya está tratando de subirlo por FTP. La solución pasa por hacer una llamada al API de Windows:

'Declaraciones Windows API:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

'Espera x milisegundos y devuelve el estado de ejecución de un proceso (si se omite el argumento espera hasta que finalice el proceso):

Function WaitForProcess(taskId As Long, Optional msecs As Long = -1) As Boolean

Dim procHandle As Long

'Obtiene el handler del proceso
procHandle = OpenProcess(&H100000, True, taskId)

'Verifica el estado del proceso y se lo devuelve a nuestra función
WaitForProcess = WaitForSingleObject(procHandle, msecs) <> -1

'Cierra el handler
CloseHandle procHandle

End Function

Utilización:

WaitForProcess Shell("gzip.exe backup.sql")

Espero q le sea útil a alguno :)