Я всегда использовал метод Run объекта wshShell, который доступен после ссылки на объектную модель хоста скриптов Windows в вашем проекте:
Dim shell As wshShell
Dim lngReturnCode As Long
Dim strShellCommand As String
Set shell = New wshShell
strShellCommand = "C:\Program Files\My Company\MyProg.exe " & _
"-Ffoption -Ggoption"
lngReturnCode = shell.Run(strShellCommand, vbNormalFocus, vbTrue)
Вы получаете ту же функциональность, что и обычный оператор Shell, но последний параметр позволяет вам решить, запускать ли очищенную программу синхронно. Вышеуказанный вызов с vbTrue является синхронным. Использование vbFalse запускает программу асинхронно.
И, как отмечалось в предыдущих ответах, вам нужно запустить командную оболочку с ключом "/ c" для выполнения внутренних команд, например, "echo foo" из вашего вопроса. Вы отправили бы «cmd / c echo foo» в метод Run.