Instrukcja Shell służy do uruchamiania zewnętrznych programów.
Oto prosty przykład:
Sub TestKalkulatora()
MsgBox "Uruchamiam kalkulator", vbInformation
Shell "calc.exe"
MsgBox "Widzę, że skończyłeś liczyć ;-)", vbInformation
End Sub
Niestety, ale druga instrukcja MsgBox wyświetli się jeszcze zanim instrukcja Shell „zdąży” uruchomić kalkulator 😉 A my chcielibyśmy, aby druga instrukcja MsgBox wykonała się dopiero wtedy gdy zamkniemy kalkulator, który został uruchomiony przez instrukcję Shell. Na szczęście jest pewne rozwiązanie tego problemu.
Pewnie zastanawiasz się, po co takie „wstrzymywanie” wykonywania programu do czasu aż zostanie zamknięty uruchomiony program? Wbrew pozorom czasami taka konstrukcja się przydaje.
Wyobraźmy sobie, że piszesz program, który pobiera jakiś plik, następnie należy go obrobić jakimś zewnętrznym programem (np. rozpakować archiwum RAR za pomocą zewnętrznego programu unrar.exe) i na tak obrobionym pliku wykonać jakąś operację.
Tutaj niestety, ale trzeba poczekać aż program unrar.exe rozpakuje owy plik co może chwilę potrwać. Instrukcje typu Sleep (np. Application.Wait w Excelu albo funkcja Win32Api o nazwie Sleep) nie jest dobrym rozwiązaniem, gdyż w zależności od wydajności komputera, rozmiaru archiwum i paru innych czynników takie rozpakowanie pliku nie zawsze zajmie tyle samo (mili)sekund.
Na szczęście można spróbować innego rozwiązania: można wstrzymać wykonywanie programu do czasu, aż uruchomiony program nie zostanie zamknięty. Można to zrobić na kilka różnych sposobów, natomiast (chyba) najprostsze rozwiązanie to skorzystanie z obiektu WScript.Shell.
Sub TestKalkulatora2()
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
MsgBox "Uruchamiam kalkulator", vbInformation
wsh.Run "calc.exe", 1, True
MsgBox "Widzę, że skończyłeś liczyć ;-)", vbInformation
End Sub
Najważniejszy jest trzeci parametr w wywołaniu metody Run obiektu wsh (Windows Script Host). Otóż wartość True oznacza wstrzymanie wykonywania programu do czasu aż uruchomiony program się nie zakończy. Jeśli zmienisz True na False to druga instrukcja MsgBox się wyświetli zanim jeszcze kalkulator zdąży się uruchomić 🙂