Parametr S nic nie robi samodzielnie.
/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
Spróbuj coś jak ten zamiast
Call Shell("cmd.exe /S /K" & "perl a.pl c:\temp", vbNormalFocus)
Nie może nawet trzeba dodać „cmd.exe” do tego polecenia, chyba że chcesz się okno polecenia, aby otworzyć się, gdy ten jest prowadzony. Powłoka powinna wykonać polecenie samodzielnie.
Shell("perl a.pl c:\temp")
-Edit-
czekać na polecenia, aby zakończyć trzeba będzie coś zrobić jak @Nate Hekman pokazuje w swojej odpowiedzi 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
nie robić tak naprawdę trzeba najpierw otworzyć cmd.exe -> Shell() może przekazać twoje argumenty perl prosto do perl.exe –