Crearea unei funcții

Realizarea manuală a unei funcții

Metoda cea mai simplă de a începe crearea unei funcții este de a scrie în fereastra Code din VBA cuvântul Function urmat de numele care va fi dat funcției și argumentele necesare între paranteze, apoi apăsarea tastei Enter. VBA adaugă automat o linie goală și instrucțiunea End Function, apoi plasează cursorul pe linia goală, pregătit pentru crearea codului de programare în noua funcție.

De exemplu, la tastarea următoarei linii și apăsarea tastei Enter,

Function Temperaturi(TempMax, TempMin)

Visual Basic Editor adaugă automat o linie goală și instrucțiunea End Function.

Începerea unei funcții folosind fereastra de dialog Add Procedure

O funcție poate fi creată și cu Editorul Visual Basic (este modul lent de a crea o funcție) folosind caseta de dialog Add Procedure:

  1. Se alege Insert > Procedure pentru a afișa caseta de dialog Add Procedure.
  2. În câmpul Name se tastează numele procedurii.
  3. În grupul de butoane Type se selectează opțiunea Function.
  4. În grupul Scope se selectează opțiunea Public sau Private (după cum este nevoie).
  5. Dacă toate variabilele locale din funcție vor fi de tip static (de obicei nu), se bifează caseta All Local Variables As Statics.
  6. Clic pe butonul OK pentru a insera funcția, după care între paranteze se scriu manual argumentele funcției.
Pentru a specifica elementele unei funcții noi, se poate folosi fereastra de dialog Add Procedure.

Transmiterea argumentelor către o funcție

Argumentele care vor fi transmise unei funcții sunt listate între paranteze, separate prin virgule. În următorul exemplu de cod, funcția afirmă că are nevoie de argumentele numite TempMax și TempMin. Aceste date trebuie transmise funcției pentru ca ea să funcționeze:

Function Temperaturi(TempMax, TempMin)

Dacă undeva în cod funcția este apelată fără a trece datele necesare, VBA va afișa mesajul de eroare „Argument Not Optional”.

De asemenea, după numele argumentului se poate specifica tipul de date al argumentelor folosind instrucțiunea As și tipul de date. De exemplu, se poate utiliza următoarea instrucțiune pentru a seta argumentele MaxTemp și MinTemp la tipul de date numeric Double:

Function Temperaturi(TempMax As Double, TempMin As Double)

Trecerea unui argument prin referință (implicit) este utilă atunci când variabila va fi manipulată în procedura destinatar și variabila se returnează la procedura de la care a provenit. În mod alternativ, trecerea unui argument după valoare este utilă atunci când se folosesc informațiile stocate în variabilă în procedura destinatar și, în același timp, informațiile originale din variabilă trebuie să fie păstrate neschimbate (dar acest caz este rar; de obicei nu este necesar).

Deoarece modul implicit de a transmite un argument este prin referință, următoarele afirmații trec argumentul MyArg prin referință:

Function TransmitPrinReferinta(MyArg) 
Function TransmitPrinReferinta(ByRef MyArg)

După cum se vede, se poate omite comanda implicită ByRef. Însă, pentru a trece un argument prin valoare, trebuie utilizat cuvântul cheie ByVal. Următoarea instrucțiune transmite argumentul ValArg după valoare:

Function TransmitPrinValoare(ByVal ValArg)

Dacă este necesar, unele argumente dintr-o procedură pot fi transmise prin referință și altele prin valoare. Următoarea declarație trece argumentul ArgRef prin referință și argumentul ArgVal prin valoare:

Function PassBoth(ByRef ArgRef, ByVal ArgVal)

Totuși, în practică este posibil să se folosească cel mai mult abordarea implicită ByRef.

Declararea tipurilor de date ale argumentelor

Tipurile de date pentru argumente pot fi declarate în mod explicit. Acest lucru folosește mai puțină memorie (deși aceasta rar mai este o problemă) și asigură faptul că procedurile externe (apelare) transmit funcției tipul corect de informații. Din acest al doilea motiv, este întotdeauna o idee bună ca să fie specificat tipul de date. În felul acesta se evită diverse erori.

Când se transmite un argument, tipul de date al argumentului transmis trebuie să se potrivească tipul de date preconizat în procedură. De exemplu, la declararea unui șir și transmiterea lui ca argument atunci când funcția de primire specifică că așteaptă un Variant, VBA afișează un mesaj de eroare.

Pentru a declara tipul de date al unui argument, se include declarația obișnuită de tip de date în lista cu argumente. Următoarea funcție declară StrArg, specificând cu As faptul că trebuie să fie transmis ca șir (String) și VarArg ca Variant:

Function PassType(StrArg As String, VarArg As Variant)

Specificarea unui argument opțional

Uneori, o funcție nu necesită întotdeauna un anumit argument. Se poate specifica dacă un argument este opțional folosind cuvântul cheie opțional:

Function PassBoth(ByRef MyArg As String, ByVal ValArg As Variant, _
Optional ByVal strName As String)

Când se specifică un argument opțional, este bine să i se atribuie o valoare implicită. Făcând acest lucru, codul este mai puțin sensibil la erori și oferă programatorului un indiciu despre ce tip de informații sunt utilizate aici. Pentru a atribui valoarea implicită, se tastează semnul egal după definiția variabilei, apoi se introduce valoarea implicită (se folosesc ghilimele duble pentru o valoare de tip String).

De exemplu, următoarea instrucțiune de funcție declară argumentul opțional strName și îi atribuie o valoare implicită dacă nu este trecută nici o valoare:

Function PassBoth(ByRef MyArg As String, ByVal ValArg As Variant, _
Optional ByVal strName As String = "Sibiu")

În acest caz, această macrocomandă este folosită de o companie situată în Sibiu, așa că cel mai adesea se folosește numele orașului pentru valoarea literală a acestei macrocomenzi. Desigur, valoarea implicită diferă, în funcție de ceea ce va face macrocomanda.

Controlul scopului unei funcții

Ca și la subrutine, o funcție poate avea un domeniu privat sau public. Domeniul privat face ca funcția să fie disponibilă numai pentru procedurile din modulul care o conține, iar domeniul public face ca funcția să fie disponibilă tuturor modulelor deschise din proiect.

Dacă nu se specifică faptul că o funcție este privată sau publică, VBA o face publică în mod implicit, deci nu este necesar să se specifice domeniul de aplicare al unei funcții decât dacă aceasta trebuie să aibă un domeniu privat. Cu toate acestea, dacă se folosesc declarații publice explicite pentru acele funcții care trebuie să fie publice, codul va fi oarecum mai ușor de citit:

Private Function Temperaturi(TempMax, TempMin)
Public Function Domeniu(Industrie, Altele)