Mai jos sunt descrise două exemple de funcții care vor funcționa în orice aplicație care găzduiește VBA. Acest lucru se datorează faptului că aceste funcții nu accesează resurse sau obiecte specifice unei anumite aplicații Office.
Pentru început, se declară mai întâi funcția și argumentele acesteia. Următoarea declarație declară o funcție numită NetProfit:
Function ProfitNet(Brut As Double, Cheltuieli As Double) As Double
NetProfit folosește două argumente, Brut și Cheltuieli, fiecare fiind declarat ca tip de date Double, un număr cu virgulă (are un punct zecimal).
La sfârșitul declarației, s-a specificat că funcția returnează un tip de date Double. Este important ca să fie specificate explicit tipurile de variabile ale argumentelor și tipul valorii pe care funcția o returnează apelantului. Acest lucru evită surprizele neplăcute (bug-urile) din cod, deoarece VBA sesizează și raportează orice încercare de a trece un tip de date greșit în funcție sau de a trimite înapoi un tip greșit de date din orice cod apelat (executat) de o funcție.
Având scrise argumentele (și tipul lor, declarat în mod explicit, așa cum se recomandă), funcția ProfitNet se poate apela ca și orice funcție pre-scrisă, încorporată în VBA (cum ar fi MsgBox). Pur și simplu se folosește numele funcției și se adaugă cele două argumente obligatorii, astfel:
Profit = ProfitNet(44000, 34000)
Aici, variabilei Profit i se atribuie valoarea funcției ProfitNet. Cu alte cuvinte, după ce această funcție își termină lucrul și execuția revine la apelant – caller (procedura care a invocat funcția), valoarea returnată este atribuită variabilei Profit.
În acest exemplu, funcției ProfitNet i s-au atribuit valori pentru argumentele Brut și Cheltuieli de 44000 și, respectiv, 34000.
După crearea funcției, Visual Basic Editor afișează o listă de argumente atunci când se introduce numele funcției într-o procedură de apelare, ca în figura de mai jos.
Procedura de mai jos conține un exemplu de apelare a unei funcții: Procedura ArataProfit apelează funcția ProfitNet și afișează rezultatul într-un mesaj.
Apelarea unei funcții
1. Sub ArataProfit()
2. MsgBox (ProfitNet(44000, 34000)),, "Profit Net"
3. End Sub
4.
5. Function ProfitNet(Brut As Double, Cheltuieli As Double) As Double
6. ProfitNet = (Brut - Cheltuieli) * 0.9
7. End Function
În codul de mai sus, liniile de la 1 până la 3 conțin procedura ArataProfit, care apelează funcția ProfitNet pe linia 2, îi transmite argumentele 44000 pentru Brut și 34000 pentru Cheltuieli, apoi afișează rezultatul într-un mesaj numit Profit Net. Se poate observa că pe linia 2 s-a folosit o scurtătură, folosind apelul funcției din interiorul unei liste de argumente. Linia 2 face același lucru ca și această versiune mai lungă:
Dim Rezultat As Double
Rezultat = ProfitNet(44000, 34000)
MsgBox (Rezultat),, "Profit Net"
Liniile de la 5 până la 7 conțin funcția ProfitNet. Linia 5 declară funcția și cele două argumente de tip Double, Brut și Cheltuieli, informând VBA ce trebuie să facă cu cele două argumente pe care linia 2 le-a transmis funcției.
Linia 6 calculează ProfitNet ca fiind 90% (0.9) din valoarea diferenței dintre Brut și Cheltuieli.
Cum fac funcțiile când returnează informații
Este important să se înțeleagă ce se întâmplă pe linia 6: informațiile calculate de funcție sunt atribuite numelui funcției. Astfel informațiile sunt transmise înapoi la procedura ArataProfit care a apelat funcția.
Pentru a face acest proces mai clar, scriem codul într-un mod verbal. Vom face acest lucru fără a utiliza comanda rapidă care face atât calculul cât și alocarea tuturor pe aceeași linie.
Sunt trei etape principale: calcul, atribuire și returnare. Acestea sunt etichetate cu 1, 2 și 3 în lista următoare.
Funcția face mai întâi calcule - în acest caz, calculează profitul net. Apoi, în al doilea rând, atribuie rezultatele calculului la propriul nume (ProfitNet, în acest caz). Această atribuire este modul în care datele sunt transmise apelantului. Și în sfârșit, în al treilea rând, cu comanda End, trimite rezultatele la orice procedură apelează funcția:
Function ProfitNet(Brut As Double, Cheltuieli As Double) As Double
Dim Rezultat As Double
1. Rezultat = (Brut - Cheltuieli) * 0.9 'face calcule
2. ProfitNet = Rezultat 'stocheaza informatia care va fi trimisa inapoi / returnata
End Function 'trimite informatia inapoi
Returnarea datelor de tip text de la o funcție
Procedura de mai jos conține o funcție care returnează un argument de tip String.
Funcție care returnează un șir de caractere (string)
1. Sub TestareFum()
2. Dim intAnFabric As Integer, strAuto As String
3. BadValueLoop:
4. On Error GoTo Bye
5. intAnFabric = InputBox("Introduceti anul fabricarii masinii.", _
"Masina are nevoie de o verificare fum?")
6. strAuto = TrebuieVerif(intAnFabric)
7. If strAuto = "Yes" Then
8. MsgBox "Masina are nevoie de verificare fum.", _
vbOKOnly + vbExclamation, "Verificare fum"
9. ElseIf strAuto = "BadValue" Then
10. MsgBox "Anul introdus este din viitor.",
vbOKOnly + vbCritical, "Verificare fum"
11. GoTo BadValueLoop
12. Else
13. MsgBox "Masina nu are nevoie de o verificare fum.", _
vbOKOnly + vbInformation, "Verificare fum"
14. End If
15. Bye:
16. End Sub
17.
18. Function TrebuieVerif(AnAuto As Integer) As String
19. If AnAuto > Year(Now) Then
20. TrebuieVerif = "BadValue"
21. ElseIf AnAuto <= Year(Now) - 3 Then
22. TrebuieVerif = "Yes"
23. Else
24. TrebuieVerif = "No"
25. End If
26. End Function
Procedura de mai sus conține procedura TestareFum (liniile de la 1 până la 16) și funcția TrebuieVerif (liniile 18 - 26). Procedura TestareFum apelează funcția TrebuieVerif. Funcția returnează o valoare care indică dacă autoturismul utilizatorului are nevoie de o verificare pentru fum. TestareFum utilizează această valoare pentru a afișa o casetă de mesaj (ca în figura de mai jos) pentru a informa utilizatorii dacă mașina are nevoie sau nu de o verificare pentru fum.
Iată cum funcționează codul:
GoTo BadValueLoop
Funcțiile pot fi și mai complexe comparativ cu exemplul de mai sus.
De exemplu, se poate include o funcție ca parte a unei expresii mai mari. Aici se adună rezultatele a două funcții - ProfitNet și SoldCurent – folosind o expresie:
EstimareCurenta = ProfitNet(44000, 33000) + SoldCurent(ContPrincipal)