You are on page 1of 4

Laborator VBA pentru Excel 4

Tablouri i Sumar Vectori n VBA


n laboratorul precedent am vzut cum putem apela func ii 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 func iei de librrie TRANSPOSE pentru a transforma vectorul VB ntr-un tablou Excel. Func ii Simple care returneaz un tablou: 1. Lansa i Microsoft Excel 2. Lansa i 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 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

3. In VBE aduga i un modul Module1 4. Tasta i codul de mai jos in modulul Module1 5. Lansa i comanda Compile VBAProject din meniul Debug pentru a verifica codul 6. Activa i foaia de calcul Excel i insera i urmtoarea serie de valori: A 1 2 3 4 5 6 7. Insera i formula TestVariant n celula D1 cu argumentul A1:C4. 8. Transforma i plaja de celule D1:F4 ntr-o formul matrice cum am vzut n laboratorul 3. 9. Insera i n alte celule formula TestVariant dar selectnd doar un vector ca argument. 10. Aduga i un punct de oprire n linia End Function i aduga i variabila TestVariant la fereastra Watch cu comanda Add Watch. Rula i codul pentru a vedea cum este returnat tabloul Arr n cazul unui vector, sau n cazul unui tablou cu dou dimensiuni. 1 4 7 10 B 2 5 8 11 C 3 6 9 12 D

Public Function SumaDiagSup(rng As Range)As Double Suma elementelor de deasupra diagonalei principale: Dim Arr() Dim Suma As Double 1. Aduga i func ia public alturat n Dim R As Integer, C As Integer modulul Module1. Dim i As Integer, j As Integer 2. Activa i foaia de calcul Excel i insera i 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. Observa ii Remarca i c am preluat elementele plajei de celule (Range) rng printr-o singur instruc iune 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. Modifica i func ia SumaDiagSup astfel nct n cazul unei matrice neptratice, func ia s returneze un mesaj de eroare.

Maximul elementelor de deasupra diagonalei principale: 1. Crea i o nou func ie denumit MaxDiagSup n modulul Module1. 2. Aduga i codul care ne va returna elementul maxim de deasupra diagonalei principale, dup modelul func iei SumaDiagSup . 3. Activa i foaia de calcul Excel i insera i 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) _ Func ii simple care returneaz un tablou nmul irea cu un As Variant scalar: Dim Arr() 1. Aduga i func ia 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. Activa i foaia de calcul Excel i insera i formula ScaleArr ntro celul liber, selectnd aceeai plaj de celule ca n exemplul precedent i da i valoarea 3 scalarului sc (=ScaleArr(A1:C4,3)). 3. Selecta i un grup de 9 celule (3x3) cu celula care con ine formula noastr n col ul stnga sus. 4. Transforma i selec ia ntr-o formul matrice.

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

i := 1

Produsul a 2 matrice Vom transcrie n VBA algoritmul prezentat n figura alturat (produsul a dou matrice). Citi i observa ia prezentat n caseta de mai jos. 1. Aduga i func ia public ProdusMatrice n modulul Module1. 2. Activa i foaia de calcul Excel i crea i dou tablouri care s respecte condi ia ca numrul de linii al primului tablou sa fie egal cu numrul de coloane al celui de-al doilea. 3. Insera i formula simpl ProdusMatrice ntr-o celul liber a foii. 4. Selecta i 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 con ine formula ProdusMatrice s se gseasc n col ul din stnga sus al selec iei. 5. Transforma i formula ntr-o formul matriceal n toat selec ia.

j := 1

cij := 0 k := 1

cij := cij + aikbkj k := k + 1

k j+1 j := n

j := j + 1

jp

i := i + 1

im

Observa ii Daca matricele care se nmul esc 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

L L O L

c1, p c2 , p M cm , p

Un element ci,j al matricei C va fi ob inut prin rela ia:

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

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. Lansa i comanda Macros din meniul Tools, grupul Macro. 2. n fereastra Macros, tasta i TestMacro n caseta Macro name: i clic Create. 3. Aduga i codul alturat n subrutina TestMacro i lansa i comanda Compile VBAProject din meniul Debug pentru a corecta erorile. 4. Aranja i ferestrele Excel i VBA astfel nct s fie ambele vizibile pe ecran. 5. Aduga i un punct de oprire n linia Texte(1, 1) i executa i codul pas cu pas cu combina ia de taste SHIFT+F8.

Bonus ncrca i documentul Excel tetris.xls i Apsa i butonul Play Game.

You might also like