Exemple de funcții pentru orice aplicație Office cu VBA activat

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:

  • TestareFum începe prin declararea pe linia 2 a variabilelor intAnFabric de tip Integer și strAuto de tip String.
  • Linia 3 conține eticheta BadValueLoop, la care execuția revine de la linia 11 dacă utilizatorul a introdus o valoare improprie pentru anul autoturismului. Va fi afișată din nou caseta de intrare, pentru a obține anul corect. Pentru ca execuția să sară la o anumită zonă din cod, se introduce doar un nume pentru locație, cum ar fi aici BadValueLoop care se încheie cu două puncte. Acest nume-plus-două-puncte se numește etichetă (label) și oferă o modalitate de a transfera execuția într-o anumită locație din macrocomandă. Apoi, în altă parte a codului, se poate transfera execuția la această etichetă folosind comanda GoTo astfel:
GoTo BadValueLoop
  • Linia 4 conține o instrucțiune On Error pentru a transfera executarea etichetei Bye la linia 15 dacă apare o eroare. Eroarea poate să apară dacă utilizatorul închide fereastra de dialog cu clic pe butonul Cancel sau pe butonul OK fără a scrie o valoare în caseta text.
  • Linia 5 afișează caseta de dialog care cere utilizatorului să introducă anul fabricării mașinii. Această linie atribuie variabilei intAnFabric valoarea introdusă de utilizator în caseta text.
  • Linia 6 setează valoarea variabilei strAuto de tip String la rezultatul funcției TrebuieVerif care a rulat pe variabila intAnFabric de tip Integer.
  • Executarea comută la funcția TrebuieVerif (linia 18), care evaluează intAnFabric și returnează valoarea pentru strAuto. Linia 18 declară funcția, atribuind valoarea ei la TrebuieVerif. Funcția ia un argument, AnAuto, care este declarat de tip Integer.
  • Linia 19 verifică dacă AnAuto este mai mare decât valoarea anului curent setat în sistem folosind Year(Now). Dacă este mai mare, linia 20 setează valoarea TrebuieVerif către BadValue, care este folosit să indice că utilizatorul a introdus o dată din viitor. Dacă nu este mai mare, rulează comanda ElseIf de pe linia 21, care verifică dacă valoarea din AnAuto este mai mică sau egală cu Year(Now) - 3, anul curent setat în sistem minus trei. Dacă este îndeplinită condiția, linia 22 setează valoarea lui TrebuieVerif la Yes; dacă nu, rulează comanda Else de pe linia 23 iar linia 24 setează valoarea lui TrebuieVerif la No. Linia 25 încheie comanda If și linia 26 încheie funcția.
  • Apoi executarea procedurii revine la linia de apelare (linia 6) din procedura TestForSmog, în care funcția TrebuieVerif returnează valoarea pe care a atribuit-o variabilei strAuto.
  • Restul procedurii TestForSmog lucrează cu variabila strAuto. Linia 7 compară strAuto cu Yes. Dacă sunt egale, linia 8 afișează un mesaj care anunță că mașina trebuie verificată la fum. Dacă strAuto nu este egal cu Yes, linia 9 compară ThisCar cu BadValue. Dacă sunt egale, linia 10 afișează un mesaj de atenționare, iar linia 11 returnează executarea etichetei BadValueLoop de pe linia 3. Dacă strAuto nu este egal cu BadValue, rulează comanda Else de pe linia 12, iar linia 13 afișează un mesaj care anunță că mașina nu trebuie verificată la fum.
  • Linia 14 încheie comanda If, linia 15 conține eticheta Bye, iar linia 16 încheie procedura.

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)