Sunteți pe pagina 1din 4

Laborator VBA pentru Excel 4

Tablouri i Sumar Vectori n VBA


n laboratorul precedent am vzut cum putem apela funcii simple care accept ca parametrii vectori, respectiv
cum putem returna vectori n foaia Excel. n cazul tablourilor cu dou dimensiuni, lucrurile se simplific, nefiind
necesar folosirea funciei de librrie TRANSPOSE pentru a transforma vectorul VB ntr-un tablou Excel.
Funcii Simple care returneaz un tablou:
1. Lansai Microsoft Excel
2. Lansai Visual Basic Editor
Public Function TestVariant(rng As Range)
Dim Arr()
Dim R As Integer, C As Integer
Dim i As Integer, j As Integer
Dim OneDimension As Boolean
R = rng.Rows.Count
C = rng.Columns.Count

3. In VBE adugai un modul Module1


4. Tastai codul de mai jos in modulul
Module1
5. Lansai comanda Compile VBAProject
din meniul Debug pentru a verifica codul
6. Activai foaia de calcul Excel i inserai
urmtoarea serie de valori:
A

OneDimension = False
If R > 1 Then
If C > 1 Then
ReDim Arr(1 To R, 1 To C)
Else
ReDim Arr(1 To R): OneDimension = True
End If
Else
ReDim Arr(1 To C): OneDimension = True
End If
If OneDimension Then
If R > 1 Then
For i = 1 To R
Arr(i) = rng(i)
Next i
Else
For i = 1 To C
Arr(i) = rng(i)
Next i
End If
Else
For i = 1 To R
For j = 1 To C
Arr(i, j) = rng(i, j)
Next j
Next i
End If
If OneDimension Then
TestVariant = WorksheetFunction.Transpose(Arr)
Else
TestVariant = Arr
End If
End Function

10

11

12

5
6
7. Inserai formula TestVariant n celula D1
cu argumentul A1:C4.
8. Transformai plaja de celule D1:F4 ntr-o
formul matrice cum am vzut n
laboratorul 3.
9. Inserai n alte celule formula
TestVariant dar selectnd doar un vector
ca argument.
10. Adugai un punct de oprire n linia End
Function i adugai variabila TestVariant
la fereastra Watch cu comanda Add
Watch. Rulai codul pentru a vedea cum
este returnat tabloul Arr n cazul unui
vector, sau n cazul unui tablou cu dou
dimensiuni.

Public Function SumaDiagSup(rng As Range)As Double Suma elementelor de deasupra diagonalei


principale:
Dim Arr()
Dim Suma As Double
1. Adugai funcia public alturat n
Dim R As Integer, C As Integer
modulul Module1.
Dim i As Integer, j As Integer
2. Activai foaia de calcul Excel i inserai
R = rng.Rows.Count
C = rng.Columns.Count
Arr = rng
Suma = 0
For i = 1 To R
For j = i To C
Suma = Suma + Arr(i, j)
Next j
Next i
SumaDiagSup = Suma
End Function

formula SumaDiagSup ntr-o celul goal


din foaia de calcul Excel, dndu-i ca
parametru plaja de celule A1:C4.
Observaii
Remarcai c am preluat elementele plajei de
celule (Range) rng printr-o singur instruciune
de atribuire n linia Arrr = rng pentru c Arr() a
fost definit ca Variant.
Observm c algoritmul SumaDiagSup nu are
nici o problem dac matricea nu este
ptratic.
3. Modificai funcia SumaDiagSup astfel
nct n cazul unei matrice neptratice,
funcia s returneze un mesaj de eroare.

Maximul elementelor de deasupra diagonalei principale:


1. Creai o nou funcie denumit MaxDiagSup n modulul Module1.
2. Adugai codul care ne va returna elementul maxim de deasupra diagonalei principale, dup modelul
funciei SumaDiagSup .
3. Activai foaia de calcul Excel i inserai formula MaxDiagSup ntr-o celul goal din foaia de calcul Excel,
dndu-i ca parametru plaja de celule A1:C4.
Public Function ScaleArr(rng As Range, ByVal sc As Double) _ Funcii simple care returneaz
un tablou nmulirea cu un
As Variant
scalar:
Dim Arr()
1. Adugai funcia public
Dim R As Integer, C As Integer
alturat n modulul Module1.
Dim i As Integer, j As Integer
R = rng.Rows.Count
C = rng.Columns.Count
Arr = rng
For i = 1 To R
For j = i To C
Arr(i, j) = Arr(i, j) * sc
Next j
Next i
ScaleArr = Arr
End Function

2. Activai foaia de calcul Excel i


inserai formula ScaleArr ntro celul liber, selectnd
aceeai plaj de celule ca n
exemplul precedent i dai
valoarea 3 scalarului sc
(=ScaleArr(A1:C4,3)).
3. Selectai un grup de 9 celule
(3x3) cu celula care conine
formula noastr n colul
stnga sus.
4. Transformai selecia ntr-o
formul matrice.

Observaii
Remarcm c att tabloul noastr Arr() l-am definit ca Variant, ct i funcia ScaleArr.
Dac declarm tabloul Arr() ca Variant putem face operaia de atribuire Arr = rng. Dac tabloul Arr() nu este
declarat ca Variant, la atribuirea Arr = rng, se produce o eroare.

Produsul a 2 matrice

i := 1

Vom transcrie n VBA algoritmul prezentat n


figura alturat (produsul a dou matrice).
Citii observaia prezentat n caseta de mai
jos.

j := 1

1. Adugai funcia public ProdusMatrice n


modulul Module1.

cij := 0

2. Activai foaia de calcul Excel i creai dou


tablouri care s respecte condiia ca
numrul de linii al primului tablou sa fie
egal cu numrul de coloane al celui de-al
doilea.

k := 1

cij := cij + aikbkj

3. Inserai formula simpl ProdusMatrice


ntr-o celul liber a foii.
4. Selectai un grup de celule de forma mxp
(numrul de rnduri al primei matrice x
numrul de coloane al celei de-a doua
matrice) astfel nct celula care conine
formula ProdusMatrice s se gseasc n
colul din stnga sus al seleciei.

k := k + 1

k j+1
n
j :=

5. Transformai formula ntr-o formul


matriceal n toat selecia.

j := j + 1

jp

i := i + 1

im

Observaii
Daca matricele care se nmulesc sunt A(m,n) i B(n,p), matricea rezultant C=AB va fi de rang (m,p).

a1,1
a2,1
M
am,1

a1, 2
a2, 2
L
am , 2

L
L
O
L

a1, n1
a2,n 1
M
am ,n 1

a1,n
a2, n
M
am ,n

b1,1

b2,1
M

bn1,1
b
n,1

b1, 2
b2, 2
M
bn1, 2
bn, 2

L
L
O
L
L

b1, p
c
b2, p 1,1
c
M = 2,1
M
bn 1, p
c
bn , p m,1

c1, 2
c2 , 2
M
cm , 2

Un element ci,j al matricei C va fi obinut prin relaia:


n

ci , j = ai ,1 b1, j + ai , 2 b2, j + K + ai , n1 bn 1, j + ai , n b1, n = ai ,k bk , j


k =1

L
L
O
L

c1, p
c2, p
M

cm , p

Public Function ProdusMatrice(rng1 As Range, rng2 As Range) As Variant


Dim Arr1(), Arr2(), Arr3() As Double
Dim row1 As Integer, col1 As Integer
Dim row2 As Integer, col2 As Integer
Dim i As Integer, j As Integer, k As Integer
row1
col1
row2
col2

=
=
=
=

rng1.Rows.Count
rng1.Columns.Count
rng2.Rows.Count
rng2.Columns.Count

If col1 <> row2 Then


ProdusMatrice = "Invalid"
Exit Function
End If
ReDim Arr3(1 To row1, 1 To col2)
Arr1 = rng1
Arr2 = rng2
For i = 1 To row1
For j = 1 To col2
Arr3(i, j) = 0
For k = 1 To col1
Arr3(i, j) = Arr3(i, j) + Arr1(i, k) * Arr2(k, j)
Next k
Next j
Next i
ProdusMatrice = Arr3
End Function
Sub TestMacro()
Dim wks As Worksheet
Dim Texte(1 To 3, 1 To 1) As String
Dim Valori(1 To 3, 1 To 1) As Integer
Texte(1, 1) = "Apa"
Texte(2, 1) = "Incalzire"
Texte(3, 1) = "Electricitate"
Valori(1, 1) = 125
Valori(2, 1) = 350
Valori(3, 1) = 75
Set wks = Application.ActiveWorkbook.Sheets.Add
wks.Range("A1:A3").Value = Texte
wks.Range("B1:B3").Value = Valori
wks.Cells(4, 1).Value = "TOTAL"
wks.Cells(4, 1).Font.Bold = True
wks.Range("B4").Formula = "=SUM(B1:B3)"
End Sub

Automatizarea Excel:
1. Lansai comanda Macros din meniul
Tools, grupul Macro.
2. n fereastra Macros, tastai TestMacro
n caseta Macro name: i clic Create.
3. Adugai codul alturat n subrutina
TestMacro i lansai comanda Compile
VBAProject din meniul Debug pentru a
corecta erorile.
4. Aranjai ferestrele Excel i VBA astfel
nct s fie ambele vizibile pe ecran.
5. Adugai un punct de oprire n linia
Texte(1, 1) i executai codul pas cu
pas cu combinaia de taste SHIFT+F8.

Bonus
ncrcai documentul Excel tetris.xls i Apsai butonul Play Game.