Laborator VBA pentru Excel 4

Tablouri şi Sumar Vectori în VBA
În laboratorul precedent am văzut 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 librărie 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 adăuga 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 următoarea 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 văzut în laboratorul 3. 9. Insera i în alte celule formula TestVariant dar selectând doar un vector ca argument. 10. Adăuga i un punct de oprire în linia End Function şi adăuga 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. Adăuga i func ia publică alăturată î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, dându-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. Observăm că algoritmul SumaDiagSup nu are nici o problemă dacă matricea nu este pătratică. 3. Modifica i func ia SumaDiagSup astfel încât în cazul unei matrice nepătratice, 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. Adăuga 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, dându-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. Adăuga i func ia publică Dim R As Integer, C As Integer alăturată î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ă, selectând aceeaşi 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 stânga sus. 4. Transforma i selec ia într-o formulă matrice.

Observa ii Remarcăm că atât tabloul noastră Arr() l-am definit ca Variant, cât şi func ia ScaleArr. Dacă declarăm 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 alăturată (produsul a două matrice). Citi i observa ia prezentată în caseta de mai jos. 1. Adăuga 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 numărul de linii al primului tablou sa fie egal cu numărul 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 (numărul de rânduri al primei matrice x numărul de coloane al celei de-a doua matrice) astfel încât celula care con ine formula ProdusMatrice să se găsească în col ul din stânga sus al selec iei. 5. Transforma i formula într-o formulă matriceală în toată selec ia.

j := 1

cij := 0 k := 1

cij := cij + aik·bkj k := k + 1

k j+1 j := ≤ n

j := j + 1

j≤p

i := i + 1

i≤m

Observa ii Daca matricele care se înmul esc sunt A(m,n) şi B(n,p), matricea rezultantă C=A·B 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, n−1 a2,n −1 M am ,n −1

a1,n a2, n M am ,n

 b1,1     b2,1 ⋅ M     bn−1,1  b  n,1

b1, 2 b2, 2 M bn−1, 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 , n−1 ⋅ bn −1, j + ai , n ⋅ b1, n = ∑ ai ,k ⋅ bk , j
k =1

n

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. Adăuga i codul alăturat în subrutina TestMacro şi lansa i comanda Compile VBAProject din meniul Debug pentru a corecta erorile. 4. Aranja i ferestrele Excel şi VBA astfel încât să fie ambele vizibile pe ecran. 5. Adăuga 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 Încărca i documentul Excel tetris.xls şi Apăsa i butonul Play Game.

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master Your Semester with a Special Offer from Scribd & The New York Times

Cancel anytime.