Utilizarea funcției Shell pentru executarea unei aplicații

În loc să utilizați funcția CreateObject pentru a porni o aplicație și a returna o referință la aceasta, utilizați funcția Shell pentru a executa o aplicație. Shell poate rula orice program executabil, iar sintaxa sa este simplă:

Shell(pathname[,windowstyle])

Aici, pathname este calea la fișier și numele programului care doriți să fie executat de comanda Shell. De asemenea, includeți în pathname orice comutatoare de linie de comandă sau argumente necesare de către programul respectiv.

Acest exemplu deschide Internet Explorer, maximizează fereastra, apoi comută focalizarea la acesta:

Sub OpenIE()
Dim id
id = Shell("c:\program files\internet explorer\iexplore.exe", vbMaximizedFocus) 
End Sub

Shell poate lansa aplicatii via extensii nume fișier

Shell poate porni, de asemenea, o aplicație pe baza unui fișier a cărui extensie de nume de fișier este asociată cu acel program. Este ca și cum faceți dublu clic pe un fișier în Windows Explorer, determinând Windows să vadă aplicația care este asociată la extensia acelui fișier.

De exemplu, să spunem că specificați o extensie .txt a numelui de fișier ca argument pentru Shell: Shell "testfile.txt". Un fișier cu extensia .txt pornește de obicei Notepad, deoarece Notepad este de obicei asociat cu extensia .txt. (Am scris „de obicei”, fiindcă utilizatorii Windows pot reatribui extensia numelui de fișier la o aplicație alternativă.) Dacă Shell nu găsește aplicația sau fișierul specificat, returnează o eroare de executare.

windowstyle este un întreg opțional de tip Variant pe care îl utilizați pentru a specifica tipul de fereastră în care se execută aplicația și pentru a comuta focalizarea la aplicația nou lansată. Tabelul următor listează constantele și valorile pentru stilul ferestrei.

Utilizarea funcției Sleep pentru a evita problemele asincrone cu Shell

Funcția Shell se execută alte programe asincron, mai degrabă decât sincron. Cu alte cuvinte, Shell nu oprește toate celelalte activități din computer până când nu își termină treaba. Deci, atunci când VBA execută o declarație Shell, se înregistrează declarația ca o acțiune care urmează să fie efectuată, dar această acțiune nu poate fi neapărat terminată înainte ca următoarea declarație din codul VBA să se execute.

Această asincronie poate provoca erori în procedurile dumneavoastră dacă declarațiile VBA ulterioare depind de instrucțiunea Shell care a fost deja executată. La acest tip de problemă, ar trebui să rulați o rezolvare brută, dar de multe ori eficientă, de a adăuga timp suplimentar pentru funcția Shell pentru a executa prima comandă înainte de a executa orice acțiune dependentă. De exemplu, este posibil să executați funcția Shell mai devreme în procedură, nu chiar înainte de acțiunile dependente. Dar o soluție mai bună este de a utiliza un apel API (cum ar fi Sleep) pentru a întârzia executarea de declarații suplimentare pentru câteva secunde, astfel încât funcția Shell să poată termina executarea. Plasați această declarație în secțiunea declarații din partea de sus a ferestrei Cod:

Public Declare 
Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Apoi apelați funcția Sleep în punctul corespunzător din cod, specificând numărul de milisecunde cu care codul va fi pus în așteptare. Următoarea declarație utilizează Sleep pentru a implementa o întârziere de 2 secunde:

Sleep (2000)