Folosirea funcțiilor

Pentru a folosi o funcție, ea se apelează (comanda call) dintr-o procedură în cod și se execută.

Pentru a apela o funcție, se poate utiliza instrucțiunea Call sau cuvântul cheie opțional Call sau utilizarea doar a numelui funcției. Utilizarea cuvântului cheie Call permite căutarea prin toate apelurile din proiect (call urmat de un spațiu). Cu toate acestea, utilizarea cuvântului cheie Call este supraîncărcare pentru funcțiile de zi cu zi; programatorii îl folosesc rar.

Sintaxa pentru instrucțiunea Call este:

 [Call] name [argumentlist]

Aici, name este un argument obligatoriu de tip String, care conține numele funcției sau a procedurii apelate, iar argumentlist este un argument opțional care poate conține o listă de variabile separate prin virgulă, matrici sau expresii care vor fi trecute la funcție sau procedură. La apelarea unei funcții, aproape întotdeauna trebuie transmise argumente (cu excepția câtorva funcții care nu iau argumente).

Parantezele pătrate care cuprind cuvântul cheie Call indică faptul că este opțional. Dacă se folosește acest cuvânt cheie, trebuie inclus și argumentul argumentlist din paranteze pătrate. În majoritatea cazurilor, codul este mai ușor de citit dacă nu se folosește cuvântul cheie Call la apelarea unei funcții.

De exemplu, următoarea declarație apelează funcția MsgBox, furnizând argumentul obligatoriu prompt (în acest exemplu este șirul Hello, World!):

MsgBox "Hello, World!"

Dar se poate folosi și cuvântul cheie Call, ca în comanda următoare, dar există puține avantaje în acest sens:

Call MsgBox "Hello, World!"

(De reținut că funcția MsgBox este una dintre puținele funcții la care se pot omite parantezele care cuprind lista de argumente.)

Unei variabile i se poate atribui rezultatul returnat de o funcție. De exemplu, în următorul fragment de cod, primele două instrucțiuni declară variabilele strExample și strLeft10 de tip String. A treia instrucțiune atribuie variabilei strExample un șir de caractere. Cea de-a patra instrucțiune utilizează funcția Left pentru a returna zece caractere numărate de la stânga din variabila strExample și a le atribui variabilei strLeft10, iar a cincea instrucțiune afișează conținutul variabilei strLeft10 într-o casetă de mesaj:

Dim strExample As String
Dim strLeft10 As String
strExample = "Tehnologia este interesanta."
strLeft10 = Left(strExample, 10)
MsgBox strLeft10 

Rezultatul unei funcții se poate atribui unei variabile, ca în exemplul următor. Aici, variabila str1 de tip String, stochează primele 13 caractere din șirul This is Pride and Patriotism (numărate de la stânga). Deci, după executarea liniei de cod, str1 conține valoarea This is Pride. Apoi variabila str2 stochează cele cinci caractere numărate de la dreapta din str1, adică Pride.

Dim str1 As String 
Dim str2 As String
strl = Left("This is Pride and Patriotism", 13) 
str2 = Right(str1, 5)
MsgBox str2

Funcțiile pot fi restrânse în diverse moduri în cod. În loc să se asocieze rezultatul funcției unei variabile, funcția poate fi introdusă direct în cod sau poate fi transmisă (ca argument) unei alte funcții. În următoarea declarație, codul este restrâns la o singură linie, evitând cu totul utilizarea variabilelor:

MsgBox Right(Left("This is Pride and Patriotism", 13), 5)

Această instrucțiune utilizează trei funcții: funcția MsgBox, funcția Left și funcția Right. (Funcția Right este contraparte a funcției Left și returnează numărul specificat de caractere din partea dreaptă a șirului specificat.)

Când sunt mai multe seturi de paranteze într-o instrucțiune VBA, codul este executat pornind de la parantezele interioare și mergând spre exterior. Același mod de lucru cu parantezele imbricate este folosit și în matematică.

Prin urmare, în exemplul anterior, funcția Left este prima evaluată și returnează cele 13 caractere din stânga șirului: This is Pride (spațiile sunt și ele considerate caractere). VBA transmite acest nou șir la funcția Right, care în acest caz preia cele cinci caractere din partea dreaptă: Pride. Apoi VBA trece acest al doilea nou șir la funcția MsgBox, care îl afișează într-o casetă de mesaje.

Limitarea imbricărilor

Puteți imbrica funcții pe multe niveluri fără ca VBA să aibă probleme, dar imbricarea pe mai multe niveluri poate deveni dificil de citit și depanat. În practică se recomandă limitarea imbricării la doar câteva nivele.

Transmiterea argumentelor unei funcții

Când o funcție are mai mult de un argument, argumentele i se pot transmite în unul din cele trei moduri:

  • Furnizând valorile argumentului, fără numele lor, pozițional (în ordinea în care funcția le așteaptă)
  • Oferind argumentele, cu numele lor, în ordinea în care funcția le așteaptă
  • Furnizând argumentele, cu numele lor, în orice ordine

Prima metodă, care furnizează argumente pozițional fără a folosi numele lor, este, de obicei, cel mai rapid mod de lucru. Singurul dezavantaj este că la citirea codului nu se știe imediat ce valoare corespunde acelui argument - deși acest lucru poate fi căutat fără probleme. Pentru a omite un argument opțional, se plasează o virgulă în acel loc în secvența de argumente.

Scrierea numelui unui argument nu durează prea mult timp, dar face codul mai ușor de citit. Și când se omiteți un argument dintr-o listă de argumente, nu mai trebuie folosită virgula pentru a indica faptul că se omite acel argument.

Nu există niciun avantaj în a folosi argumentele cu nume în altă ordine, cu excepția cazului în care acest mod de lucru este mai ușor.

De exemplu, funcția DateSerial returnează un Variant / Date care conține data pentru un an, o lună și o zi dată. Sintaxa pentru DateSerial este:

DateSerial(year, month, day)

Aici, argumentele sunt de tip Integer și obligatorii: year pentru an, month pentru lună și day pentru zi.

Următoarea comandă furnizează argumentele pozițional, fără numele lor:

MsgBox DateSerial(2016, 12, 31)

Această comandă este echivalentă, dar furnizează argumentele pozițional și numele lor:

MsgBox DateSerial(Year:=2016, Month:=12, Day:=31)

Următoarea comandă furnizează argumentele, cu numele lor, în altă ordine:

MsgBox DateSerial(Day:=31, Year:=2016, Month:=12)

Toate cele trei comenzi funcționează bine și ajung la același rezultat.

Apar probleme doar dacă argumentele sunt enumerate în altă ordine și sunt furnizate fără nume (pozițional), dacă sunt numite doar câteva argumente sau dacă se omite furnizarea argumentelor necesare. Imaginea următoare arată una dintre erorile întâmpinate. În acest caz, s-a omis argumentul obligatoriu pentru month.