Sunteți pe pagina 1din 19

INSTRUCIUNILE VBA

Generaliti
Exist trei categorii de instruciuni Visual Basic:

instruciuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru variabile, constante i proceduri; instruciuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor; instruciuni executabile (prezentate n continuare) care iniiaz aciuni: execut metode sau proceduri, controleaz fluxul execuiei codului.

n mediul de dezvoltare VBA, sintaxa instruciunilor este verificat automat dup ce se trece la instruciunea urmtoare (prin Enter).

Continuarea instruciunilor
O instruciune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de un spaiu. De exemplu, crearea prin program a unui tabel ntr-un document Word:
ActiveDocument.Tables.Add Range:=Selection.Range, _ NumRows:=3, _ NumColumns:= 3

unde, pe lng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare a unui nou tabel la colecia de tabele a documentului. Dou instruciuni pot fi scrise pe o aceeai linie dac sunt separate cu caracterul ":".

Etichetarea liniilor
O linie poate fi identificat:

printr-o etichet: orice nume, care respect regulile generale, care ncepe n prima coloan a liniei i se termin cu caracterul ":" printr-un numr: orice combinaie de cifre, care ncepe n prima coloan a liniei i este unic n modulul respectiv.

Identificatorii de linii pot fi utilizai n instruciuni de control, desi codul astfel construit nu respect regulile programrii structurate..

Comentarii
Textele explicative (necesare documentrii codului) pot fi introduse pe linii separate sau n continuarea liniei de cod. O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Rem urmat de un spaiu. Comentariul de pe aceeai linie cu o instruciune se introduce printr-un apostrof urmat de comentariu.

Operatori
n formarea expresiilor de diverse tipuri, operatorii sunt cei utilizai aproape general n limbajele de programare de nivel nalt. Pentru fixarea termenilor i notaiilor sunt totui prezentai, pe categorii, nsoii, acolo unde este cazul de scurte explicaii.

Operatori aritmetici
Operator ^ Semnificaie Ridicarea putere nmulirea Observaii la rezultatul este Double sau Variant(Double) cu excepia: dac un operand este Null, rezultatul este tot Null rezultatul este dat de cel "mai precis" factor, ordinea cresctoare a "preciziei" fiind, pentru nmulire, Byte, Integer, Long, Single, Currency, Double i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excepii se va studia Help *(operator). rezultatul este, n general, Double sau Variant(Double). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excepii se va studia Help /(operator). nainte de mprire, operanzii sunt rotunjii la Byte, Integer sau Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0.

mprirea

mprirea ntreag

Mod

Restul mpririi

operanzii sunt rotunjii la ntregi i se obine restul mpririi. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. n general, operanzi numerici produc adunarea, iar operanzi iruri produc concatenarea. n cazul numeric, rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i scdere: Byte, Integer, Long, Single, Double, Currency i Decimal. Deoarece operanzii pot fi orice expresie, pentru o informare complet (de exemplu operanzi Variant) se va studia Help +(operator).

Adunarea numeric sau concatenarea irurilor

Scderea sau operanzii pot fi doar numerici. Rezultatul inversarea este de tipul cel "mai precis" al operanzilor, semnului ordinea de "precizie" fiind pentru adunare i scdere: Byte, Integer, Long, Single, Double, Currency i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excepii se va studia Help -(operator).

Operatori de comparare
Relaiile care exist ntre diferite tipuri de entiti se pot evidenia prin comparaii avnd una dintre formele urmtoare: result = expression1 comparisonoperator expression2 result = object1 Is object2 result = string Like pattern unde result este o variabil numeric expression este o expresie oarecare

comparisonoperator este un operator relaional object este un nume de obiect string este o expresie ir oarecare pattern este o expresie String sau un domeniu de caractere. Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau egal), > (mai mare), >= (mai mare sau egal), = (egal), <> (diferit, neegal). Rezultatul este True (dac este adevrat relaia), False (dac relaia este neadevrat), Null (dac cel puin un operand este Null). Operatorul Is produce True dac variabilele se refer la acelai obiect i False n caz contrar. Operatorul Like compar dou iruri cu observaia c al doilea tremen este un ablon. Prin urmare rezultatul este True dac primul ir operand este format dup ablon, False n caz contrar. Atunci cnd un operand este Null, rezultatul este tot Null. Comportarea operatorului Like depinde de instruciunea Option Compare, care poate fi:

Option Compare Binary, ordinea este cea a reprezentrii interne binare, determinat n Windows de codul de pagin. Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de setrile locale ale sistemului.

Construcia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere: ? un caracter oarecare * oricte caractere (chiar nici unul) # o cifr oarecare (09). [charlist] oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea cratimei. [!charlist] orice caracter care nu este n list Observaie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construcii de tip list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ]. Pentru alte observaii utile se va studia Help Like operator.

Operatori de concatenare
Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +. n sintaxa expression1 & expression2 unde operanzii sunt expresii oarecare, rezultatul este

de tip String, dac ambii operanzi sunt String de tip Variant(String) n celelalte cazuri Null, dac ambii operanzi sunt Null.

nainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Empty sunt tratate ca iruri de lungime zero ("").

Operatori logici
Pentru operaiile logice sunt utilizai urmtorii operatori, uzuali n programare. Operator And Semnificaie conjuncia logic Observaii Null cu False d False, Null cu True sau cu Null d Null. Operatorul And realizeaz i operaia de conjuncie bit cu bit pentru expresii numerice. Dac o expresie este Null, rezultatul este Null. Eqv realizeaz i compararea bit cu bit a dou expresii numerice, poziionnd cifrele binare ale rezultatului dup regulile de calcul ale echivalenei logice: 0 Eqv 0 este 1 etc. True Imp Null este Null, False Imp * este True, Null Imp True este True, Null Imp False (sau Null) este Null. Operatorul Imp realizeaz i compararea bit cu bit a dou expresii numerice, poziionnd cifrele binare ale rezultatului dup regulile de calcul ale implicaiei logice: 1 Imp 0 este 0, n rest rezultatul este 1. Not Null este Null. Prin operatorul Not se poate inversa bit cu bit valorile unei variabile, poziionndu-se corespunztor un rezultat numeric.

Eqv

echivalena logic

Imp

implicaia logic

Not

negaia logic

Or

disjuncia logic

Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaz i o comparaie bit cu bit a dou expresii numerice poziionnd biii corespunztori ai rezultatului dup regulile lui Or logic. Dac un operand este Null, atunci rezultatul este Null. Se poate efectua operaia de sau exclusiv i bit cu bit pentru dou expresii numerice [b1+b2(mod 2)].

Xor

disjuncia exclusiv

Instruciuni de atribuire
Atribuirea se poate efectua prin instruciunea Let (pentru valori atribuite variabilelor i proprietilor), Set (pentru atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite de utilizator).

Instruciunea Let
Atribuie valoarea unei expresii la o variabil sau proprietate. [Let] varname = expression unde varname este nume de variabil sau de proprietate. Este de remarcat forma posibil (i de fapt general utilizat) fr cuvntul Let. Observaii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu pot fi atribuite variabilelor de tip String i nici reciproc. Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dac valoarea expresiei Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip String (cu excepia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric. La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei. Atribuirea valorilor de tip utilizator poate fi efectuat doar dac ambii termeni au acelai tip definit. Pentru alte situaii se va utiliza instruciunea Lset. Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n aceast situaie instruciunea Set.

Instruciunea LSet

Copie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Deoarece copierea este binar, poate fi utilizat pentru atribuiri ntre tipuri utilizator diferite (rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este LSet stringvar = string LSet varname1 = varname2 unde stringvar, string reprezint variabila de tip String i expresia de acelai tip implicate ntro atribuire de iruri. varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruciunea Type) diferite. Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stnga) n zona de memorie a primei variabile. Caracterele care rmn neocupate se completeaz cu spaii, iar dac zona de unde se copie este mai mare, caracterele din dreapta se pierd (sunt trunchiate).

Instruciunea LSet
Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Sintaxa este RSet stringvar = string Caracterele rmase neocupate n variabil sunt completate ccu spaii. Instruciunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator.

Instruciuni executabile
Execuia unui program are loc, n lipsa oricrui control, instruciune cu instruciune, de la stnga la dreapta i de sus n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a operaiilor n evaluarea expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele programrii i din acest motiv necesitatea structurilor de control a fluxului execuiei. Unele instruciuni au fost pstrate doar din motive de compatibilitate cu versiunile iniiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare.

Instruciuni de transfer (GoSubReturn, GoTo, OnError, OnGoSub, OnGoTo)

Aceast categorie cuprinde instruciunile prin care controlul execuiei este transferat la o alt instruciune din procedur. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul programrii structurate) i prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de programare. GoSubReturn n cadrul unei proceduri un grup de instruciuni poate fi organizat ca o subrutin (similar unei proceduri on-line, nenumite) identificat prin linia de nceput. Transferul controlului la acest grup de instruciuni i revenirea la locul apelului se poate efectua prin GoSub Return cu sintaxa GoSub line ... line ... Return unde line este o etichet de linie sau un numr de linie din aceeai procedur. Pot exista mai multe instruciuni Return, prima executat produce saltul la instruciunea care urmeaz celei mai recente instruciuni GoSub executate. GoTo Realizeaz tranferul controlului execuiei la o linie din aceeai procedur. GoTo line unde line este o etichet de linie sau un numr de linie din aceeai procedur. On Error Permite controlul erorilor prin transferul controlului la rutine de tratare. Observaie. Este prezentat n seciunea dedicat controlului erorilor. OnGoSub, OnGoTo Permit o ramificare multipl, dup valoarea unei expresii. Se recomand, pentru claritatea codului, utilizarea structurii Select Case n locul acestor structuri.

On expression GoSub destinationlist On expression GoTo destinationlist unde expression este o expresie numeric avnd valoare ntreag (dup o eventual rotunjire) ntre 0 i 255 inclusiv. destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele categorii), din aceeai procedur cu instruciunea. Dac valoarea expresiei este negativ sau mai mare dect 255 se produce o eroare. Dac valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfer controlul la linia identificat de al k-lea element al listei. Dac valoarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueaz la linia care urmeaz instruciunea On...GoSub sau On...GoTo.

Instruciuni de terminare sau oprire a programului (DoEvents, End, Exit, Stop)


Terminarea execuiei programului sau oprirea temporar (pauza) se pot realiza prin instruciunile enumerate aici. DoEvents Dei nu este o instruciune VBA ci este o funcie, includerea ei este natural prin aceea c permite cedarea controlului ctre sistemul de operare, care poate astfel s funcioneze n regim de multitasking. Aciunea poate fi realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este DoEvents( ) Funcia returneaz, n general, valoarea 0. Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de evenimente, ca i procesarea tuturor caracterelor din coada SendKeys. Observaie. Pentru alte observaii se va studia documentaia comenzii DoEvents. End

Termin execuia unei proceduri (sub forma prezentat aici) sau indic sfritul codului unei structuri de tip bloc (cum ar fi End Function, End If etc., prezentate la structurile respective). Sintaxa, n ipostaza opririi execuiei, este: End Prin aceast instruciune, care poate fi plasat oriunde n program, execuia este terminat imediat, fr a se mai executa eventualele instruciuni scrise pentru tratarea unor evenimente specifice sfritului de program (Unload, Terminate etc.). Fiierele deschise prin Open sunt nchise i toate variabilele sunt eliberate. Obiectele create din modulele clas sunt distruse, iar referinele din alte aplicaii la asemenea obiecte sunt invalidate. Memoria este eliberat. Exit Prin instruciunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execuie (cum ar fi o procedur, o structur iterativ etc.) pentru a se continua nivelul apelant. Sintaxa este Exit Do Exit For Exit Function Exit Property Exit Sub i efectele sunt prezentate la structurile respective. Nu trebuie confundat cu instruciunea End. Stop Efectul instruciunii este dependent de modul de execuiei a programului. Dac se execut varianta compilat a programului (fiierul .exe) atunci instruciunea este similar instruciunii End (suspend execuia i nchide fiierele deschise). Dac execuia este din mediul VBA, atunci se suspend execuia programului, dar nu se nchid fiierele deschise i nu se terge valoarea variabilelor. Execuia poate fi reluat din punctul de suspendare. Stop Instruciunea este similar introducerii unui punct de oprire (Breakpoint) n codul surs.

Structuri iterative While...Wend, With)

(Do...Loop,

For...Next,

For

Each...Next,

Prin intermediul construciilor de tip bloc prezentate n aceast seciune se poate repeta, n mod controlat, un grup de instruciuni. n cazul unui numr nedefinit de repetiii, condiia de oprire poate fi testat la nceputul sau la sfritul unui ciclu, prin alegerea structurii adecvate. DoLoop Se vor utiliza structuri DoLoop pentru a executa un grup de instruciuni de un numr de ori nedefinit aprioric. Dac se cunoate numrul de cicluri, se va utiliza structura ForNext. nainte de continuare se va testa o condiie (despre care se presupune c poate fi modificat n instruciunile executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condiiei i decizia luat. Do [{While | Until} condition] [statements] [Exit Do] [statements] Loop sau Do [statements] [Exit Do] [statements] Loop [{While | Until} condition] unde condition este o expresie care valoare de adevr True sau False. O condiie care este Null se consider False.

statements sunt instruciounile care se repet atta timp (while) sau pn cnd (until) condiia devine True. Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruciune care urmeaz ntregii structuri (deci de dup linia care ncepe cu Loop). Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax). Dac apare o comand Exit Do se poate omite chiar i condiia din enun ntruct execuia se va termina prin aceast decizie. Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfer controlul la nivelul Do imediat superior. Execuia structurilor este explicat n tabelul urmtor Do WhileLoop Testeaz condiia la nceputul buclei, execut bucla numai dac rezultatul este True i continu astfel pn cnd o nou evaluare produce False. Testeaz condiia la nceputul buclei, execut bucla numai dac rezultatul este False i continu astfel pn cnd o nou evaluare produce True. Se execut ntotdeauna bucla o dat, se testeaz condiia la sfritul buclei i se repet bucla att timp ct condiia este True. Oprirea este pe condiie fals. Se execut ntotdeauna bucla o dat, se testeaz condiia la sfritul buclei i se repet bucla att timp ct condiia este False. Oprirea este pe condiie adevrat.

Do UntilLoop

DoLoop While

DoLoop Until

ForNext Atunci cnd se cunoate numrul de repetri ale unui bloc de instruciuni, se va folosi structura ForNext. Structura utilizeaz o variabil contor, a crei valoare se modific la fiecare ciclu, oprirea fiind atunci cnd se atinge o valoare specificat. Sintaxa este: For counter = start To end [Step step] [statements]

[Exit For] [statements] Next [counter] unde counter este variabila contor (numr repetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou. start este valoarea iniial a contorului. end este valoarea final a contorului. step este cantitatea care se adun la contor la fiecare pas. n cazul n care nu se specific este implicit 1. Poate fi i negativ. statements sunt instruciunile care se repet. Dac nu se specific, atunci singura aciune este cea de modificare a contorului de un numr specificat de ori. Aciunea este dictat de pasul de incrementare i relaia dintre valoarea iniial i cea final. Instruciunile din corpul structurii se execut dac
o o

counter <= end pentru step >= 0 sau counter >= end pentru step < 0.

Dup ce toate instruciunile s-au executat, valoarea step este adugat la valoarea contorului i instruciunile se execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima instruciune de dup linia Next. Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd exist structuri ForNext mbricate. Corpul unei bucle ForNext poate include (complet) o alt structur ForNext. n asemenea situaii, structurile mbricate trebuie s aib variabile contor diferite. Instruciunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul execuiei se transfer la prima instruciune de dup linia Next. For EachNext Similar structurii ForNext, structura For EachNext repet un grup de instruciuni pentru fiecare element dintr-o colecie de obiecte sau dintr-un tablou (cu excepia celor de

un tip utilizator). Este util atunci cnd nu se cunoate numrul de elemente sau dac se modific, n timpul execuiei, coninutul coleciei. Sintaxa este: For Each element In group [statements] [Exit For] [statements] Next [element] unde element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colecie de obiecte, atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect specific pentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, element poate fi doar o variabil de tip Variant. group este numele coleciei de obiecte sau al tabloului. statements este grupul de istruciuni executate pentru fiecare element. Execuia unei structuri For EachNext este 1. Se definete element ca numind primul element din grup (dac nu exist nici un element, se transfer controlul la prima instruciune de dup Next se prsete bucla fr executarea instruciunilor). 2. Se execut instruciunile din corpul buclei For. 3. Se testeaz dac element este ultimul element din grup. Dac rspunsul este afirmatif, se prsete bucla. 4. Se definete element ca numind urmtorul element din grup. 5. Se repet paii 2 pn la 4. Instruciunile Exit For sunt explicate la ForNext. Buclele ForEach...Next pot fi mbricate cu condiia ca elementele utilizate la iterare s fie diferite. Observaie. Pentru tergerea tuturor obiectelor dintr-o colecie se va utiliza ForNext i nu For EachNext. Se va utiliza ca numr de obiecte colecie.Count.

WhileWend Execut un grup de instruciuni att timp ct este adevrat o condiie. Sintaxa While condition [statements] Wend Este recomandat s se utilizeze o structur DoLoop n locul acestei structuri. With Programarea orientat pe obiecte produce, datorit calificrilor succesive, construcii foarte complexe atunci cnd se numesc proprietile unui obiect. n cazul modificrilor succesive ale mai multor proprieti ale aceluiai obiect, repetarea zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificat prin utilizarea structurii WithEnd With. O asemenea structur execut o serie de instruciuni pentru un obiect sau pentru o variabil de tip utilizator. Sintaxa este: With object [statements] End With unde object este numele unui obiect sau a unui tip definit de utilizator statements sunt instruciunile care se execut pentru entitatea precizat. Permind omiterea recalificrilor din referinele la obiectul precizat, orice construcie de tipul ".nume" este interpretat n instruciunile structurii drept "object.nume". ntr-un bloc With nu se poate schimba obiectul procesat. La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificrile eventuale la acest obiect vor fi efectuate. Nu se recomand saltul n i dintr-un bloc With.

Structuri de decizie (IfThenElse, Select Case)

Ramificarea firului execuiei dup rezultatul verificrii unei condiii este o necesitate frecvent n orice implementare. Pe lng structurile prezentate, se pot utiliza trei funcii care realizeaz alegeri n mod liniarizat (pe o linie de cod): Choose(), Iif(), Switch(). IfThenElse O asemenea structur, ntlnit de altfel n toate limbajele de programare, execut un grup de instruciuni ca rspuns la ndeplinirea unei condiii (compus sau nu din mai multe condiii testate secvenial). Sintaxa permite o mare varietate de forme: If condition Then [statements] [Else elsestatements] sau If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If unde condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat False); expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat n objecttype. statements, elsestatements, elseifstatements sunt blocurile de instruciuni executate atunci cnd condiiile corespunztoare sunt True. La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruciuni, separate de ":", pe aceeai linie. Verificarea condiiilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor rezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True).

Select Case Instruciunea Select Case se poate utiliza n locul unor instruciuni ElseIf multiple (dintro structur IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruciunea Select Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruciunii IfThenElseIf. Totui, Select Case produce un un cod mai eficient i mai inteligibil. Sintaxa este: Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else [elsestatements]] End Select unde testexpression este o expresie numeric sau ir. expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma:

expression. expression To expression. Cuvntul To introduce un interval de valori, valoarea minim fiind prima specificat. Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare (exceptnd Is i Like) pentru a specifica un domeniu de valori.

statements-n reprezint una sau mai multe instruciuni care se vor executa dac testexpression este egal cu un element din expressionlist-n. elsestatements reprezint una sau mai multe instruciuni care se vor executa dac testexpression nu este egal cu nici un element din listele liniilor Case. Dac testexpression se potrivete cu un element dintr-o list Case, se vor executa instruciunile care urmeaz aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execuiei trece apoi la instruciunea care urmeaz liniei finale End Select. Rezult c dac testexpression se regsete n mai multe liste, doar prima potrivire este considerat. Clauza Case Else are semnificaia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruciunile care se execut atunci cnd expresia de test nu se potrivete nici

unui element din listele clauzelor Else. Dac aceasta este situaia i nu este specificat o clauz Case Else, atunci execuia urmeaz cu prima instruciune de dup End Select. Instruciunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structur are End Select propriu, includerea este complet). Apeluri de proceduri i programe n aceast seciune se prezint doar funcia Shell(), deoarece despre proceduri i apelul lor s-a discutat n capitolul 1. Funcia Shell() Execut un program executabil i returneaz un Variant(Double) reprezentnd ID-ul de task al programului n caz de succes; n caz contrar returneaz zero. Sintaxa este Shell(pathname[,windowstyle]) unde pathname este Variant (String). Conine numele programului care se execut, argumentele necesare i poate da calea complet (dac este nevoie). windowstyle este Variant (Integer) i precizeaz stilul ferestrei n care se va executa programul (implicit este minimizat, cu focus). Valorile posibile pentru argumentul windowstyle sunt Constanta numit VbHide VbNormalFocus VbMinimizedFocus VbMaximizedFocus VbNormalNoFocus Valoarea 0 1 2 3 4 Semnificaia Fereastra este ascuns iar focus-ul este pe fereastra ascuns. Fereastra are focus-ul i este dimensionat i poziionat normal. Fereastra este afiat ca o icoan (minimizat) dar are focus-ul. Fereastr maximizat, cu focus. Fereastra este normal (restaurat la mrimea i poziia cea mai recent) dar nu are focus-ul. Fereastra activ

curent i pstreaz focus-ul. VbMinimizedNoFocus 6 Fereastr minimizat, fr focus. Fereastra activ curent i pstreaz focus-ul.

Dac funcia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut asincron, deci nu exist certitudinea c acest program se termin nainte de execuia instruciunilor care urmeaz liniei Shell.

S-ar putea să vă placă și