Параметр S ничего не делает сам по себе.
/S Modifies the treatment of string after /C or /K (see below)
/C Carries out the command specified by string and then terminates
/K Carries out the command specified by string but remains
Попробуйте что-то вроде этого вместо
Call Shell("cmd.exe /S /K" & "perl a.pl c:\temp", vbNormalFocus)
Вы можете даже не нужно добавлять «cmd.exe» в этой команде, если вы не хотите, чтобы окно командной строки, чтобы открыть, когда это выполняется. Shell должна выполнить команду самостоятельно.
Shell("perl a.pl c:\temp")
-Edit-
Ждать команду, чтобы закончить вам придется сделать что-то вроде @Nate Хекман показывает в своем ответе here
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
wsh.Run "cmd.exe /S /C perl a.pl c:\temp", windowStyle, waitOnReturn
вы не на самом деле даже нужно сначала открыть cmd.exe -> Shell() может передать ваши perl args прямо на perl.exe –