Sunteți pe pagina 1din 4

Laborator VBA pentru Excel 1

Adugarea unei funcii simple


1. Lansai Microsoft Excel
2. Completai foaia 1 ca in figura alturata
3. Lansai Visual Basic Editor (Tools Macro Visual Basic Editor)
4. In VBE adugai un modul (Insert Module)
5. Tastai codul de mai jos in modulul Module1


6. nchidei VBE (File Close and Return to Microsoft
Excel)
7. Mutai cursorul in celula C2
8. Lansai comanda Insert Fuction
9. In fereastra de dialog Insert Function, selectai
categoria User Defined, respectiv funcia Suma in lista
Select a function:


10. In fereastra Function Arguments adugai ca
argumente coninutul celulelor B1 si B2 ca in
figura alturata
11. Apsai OK

Depanarea si inspectarea variabilelor
1. Redeschidei VBE
2. In linia Suma = a + b adugai un punct de oprire (Debug Toggle Breakpoint)
3. Activai aplicaia Excel selectnd butonul Microsoft Excel in Taskbar.
4. Modificai coninutul celulei B2 in 1.5 si apsai Enter


1. Modificai funcia Suma de forma:
Public Function Suma(a As Double, b As Double) As Double
Suma = a + b
End Function
2. Revenii in foaia Excel si forai recalcularea formulei apsnd CTRL+ALT+F9
3. Interpretai noile rezultate obinute

Remarcai ca Excel trece automat in VBE in funcia Suma pentru a
recalcula formula cu noua valoare. Pentru ca am adugat un punct de
oprire, execuia se oprete la acest punct.
In acest moment suntem in modul Depanare (Debug)
Putem inspecta valorile variabilelor mutnd pointerul mausului peste
numele unei variabile si ateptnd apariia unui Tooltip care afieaz
valoarea variabilei.
Putem executa pas cu pas liniile de cod cu tasta F8 (Debug Step Into)
Algoritmi ramificai
Vom scrie o funcie VB care evalueaz funcia (schema logica a funciei a fost prezentata in laboratorul
Algoritmi si scheme logice):
( )

< < +
+
=
1 2
1 0 3
0 2
2
x x
x x
x x x
x f
1. Activai VBE si in modulul Module1 adugai urmtorul cod:
Public Function Functie(x As Double) As Double
If (x <= 0) Then
Functie = x ^ 2 + 2 * x
Else
If (x >= 0) Then
Functie = 2 * x
Else
Functie = x + 3
End If
End If
End Function
2. Adugai puncte de oprire in fiecare din ramurile de execuie ale algoritmului si executai funcia pentru
diferite valori ale lui x pentru a parcurge fiecare dintre ramurile de execuie.
Algoritmi ciclici cu numr cunoscut de pai
Vom scrie o funcie VB care evalueaz factorialul unui numr (schema logica a funciei a fost prezentata in
laboratorul Algoritmi si scheme logice):
1. Activai VBE si in modulul Module1 adugai urmtorul cod:
Public Function Factorial(n As Long) As Long
Dim i As Integer

Factorial = 1
For i = 1 To n
Factorial = Factorial * i
Next i
End Function
2. Adugai un punct de oprire in linia Factorial = Factorial * i si executai aceasta funcie pentru diferite
valori ale lui n.
Obs. Vom remarca ca funcia Factorial poate calcula valori ale factorialului pentru numere cuprinse intre 1 si
12. Daca numrul este mai mare dect 12 se produce o depire a capacitii de stocare a variabilelor
de tip long.
3. Modificai funcia astfel nct pentru numere mai mari dect 12, funcia factorial sa returneze un mesaj de
eroare.
Public Function Factorial(n As Long) As Variant
Dim i As Integer

If (n > 12) Then
Factorial = "Depasire"
Else
Factorial = CLng(1)
For i = 1 To n
Factorial = Factorial * i
Next i
End If
End Function


Obs. Remarcam ca am transformat tipul de data al funciei din Long in Variant. Tipul de data Variant poate
retine oricare din tipurile de date numerice (Integer, Long, Single) sau de tip sir de caractere (String).
In ramura Else am adugat o funcie de conversie VB Convert to Long (CLng).
Inspectarea variabilelor cu Inspectorul
4. Adugai doua puncte de oprire in liniile Factorial =
"Depasire" si Factorial = CLng(1).
5. Mutai cursorul in interiorul variabilei Factorial si din meniul
Debug lansai comanda Add Watch.
6. In fereastra de dialog Add Watch asigurai-v ca in cmpul
Expression apare numele variabilei Factorial
7. Apsai Enter.


Remarcai deschiderea ferestrei Watches in
VBE.
8. Reexecutai codul funciei Factorial pentru
valori ale variabilei n mai mici sau mai mari
dect 12 si urmrii valoarea si tipul
variabilei Factorial in fereastra Watches.
9. Modificai expresia Factorial = CLng(1) in Factorial = 1 si verificai tipul de data al variabilei
Factorial in fereastra Watches pentru diverse valori ale lui n.
10. Adugai un bloc IF pentru a verifica daca n este negativ. Daca n este negativ returnai din funcia Factorial
mesajul Negativ.
Public Function Factorial(n As Long) As Variant
Dim i As Integer

If (n < 0) Then
Factorial = "Negativ"
Else
If (n > 12) Then
Factorial = "Depasire"
Else
Factorial = 1
For i = 1 To n
Factorial = Factorial * i
Next i
End If
End If
End Function
Algoritmi ciclici cu numr necunoscut de pai
Vom scrie o funcie VB care calculeaz e
x
cu eroarea absoluta .
Indicaie: Pentru calculul lui e
x
vom folosi dezvoltarea in serie:

! ! 2
1
2
0
n
x x
x u e
n
k
k
x
+ + + + = =

=
L cu
1
!

= =
k
k
k
u
k
x
k
x
u
Schema logica a algoritmului este prezentata in figura de mai jos. Vom iniializa variabilele e cu zero, k
(variabila contor) cu 1, respectiv variabila u cu 1.
1. Adugai in modulul Module1 codul sursa de mai jos.
2. Inserai in foaia Excel aceasta funcie si calculai valoarea exponentului pentru diverse valori ale lui x.
3. Verificai valoarea obinuta de funcia noastr cu valoarea rezultata prin folosirea funciei din librria Excel
de funcii EXP.
4. Adugai puncte de oprire pentru a parcurge algoritmul pas cu pas in mod Debug.



START
x, eps
e := 0
u := 1
k := 0
|u|>eps
e := e + u
k := k + 1
u := ux/k
DA
e
STOP
NU

Public Function ExpX(x As Double) As Double
Const Eps = 0.0001
Dim u As Double
Dim k As Integer

ExpX = 0
u = 1
k = 0
While (Abs(u) > Eps)
ExpX = ExpX + u
k = k + 1
u = u * x / k
Wend
End Function
Obs. Observai ca am adugat o constanta declarata cu cuvntul
cheie Const. Pentru calculul modulului unei valori, folosim
funcia VB Abs. Pentru ciclul cu numr necunoscut de pai
condiionat anterior am folosit instruciunea While Wend.

Vom scrie o funcie VB care extrage rdcina ptrata dintr-un numr a, cu o precizie constant .
Indicaie: Se tie c irul (x
n
) definit prin

|
|

\
|
+ = =

1
1 1
2
1
,
n
n n
x
a
x x a x converge la a . Limita a se aproximeaz prin acel termen al irului x
n

pentru care <
1 n n
x x .
Schema logica a algoritmului este prezentata in figura de mai jos.

START
a, eps
x
n-1
:= a
x
n
:= (x
n-1
+a / x
n-1
)/2

DA
x
n
STOP
NU
|x
n
x
n-1
|>eps
x
n-1
:= x
n

Public Function Radical(a As Double) As Double
Const Eps = 0.0001
Dim xn1 As Double
Dim xn As Double

xn = a
Do
xn1 = xn
xn = (xn1 + a / xn1) / 2
Loop While (Abs(xn - xn1) >= Eps)
Radical = xn
End Function
1. Adugai in modulul Module1 codul sursa de mai sus.
2. Inserai in foaia Excel aceasta funcie si calculai valoarea
radicalului pentru diverse valori ale lui a.
3. Verificai valoarea obinuta de funcia noastr cu valoarea
rezultata prin folosirea funciei din librria Excel de funcii SQRT.
4. Adugai puncte de oprire pentru a parcurge algoritmul pas cu
pas in mod Debug.