Copied to clipboard

Matrici și vectori în VBA

O matrice este o singură variabilă cu mai multe compartimente pentru a stoca valori, în timp ce o variabilă tipică are un singur compartiment de stocare în care poate stoca o singură valoare. Puteți accesa matricea ca un întreg atunci când doriți să vă referiți la toate valorile pe care le conține sau puteți accesa elementele sale individuale.

De exemplu, pentru a stoca cheltuielile zilnice pentru fiecare zi a săptămânii, puteți declara o variabilă matrice cu 7 locații, în loc să declarați 7 variabile. Fiecare element dintr-o matrice conține o valoare. Următoarea instrucțiune declară variabila matrice cu 7 elemente. În mod implicit, o matrice este indexată începând cu zero, astfel încât limita superioară a matricei este 6 și nu 7.

VB

Dim cheltuieli (6) As Double

După cum puteți vedea, această declarație este foarte asemănătoare cu cea pe care ați folosi-o pentru o variabilă obișnuită. Diferența este numărul 6 închis între paranteze. Parantezele spun VBA că declarați un vector , iar numărul indică VBA indexul superior al vectorului.

Utilizați un indice pentru a accesa un element din vector prin includerea indicelui între paranteze. Următorul exemplu atribuie o valoare inițială de 20 fiecărui element din matrice.

VB

Sub Init() 
	Dim cheltuieli(6) As Double
	Dim i As Integer 
	For i = 0 to 6
		cheltuieli(i) = 20 
	Next 
End Sub

Modificarea limitei inferioare

Utilizați instrucțiunea Option Base la începutul unui modul pentru a modifica indexul implicit al primului element de la 0 la 1. În exemplul următor, instrucțiunea Option Base modifică indexul pentru primul element, iar instrucțiunea Dim declară variabila matrice. cu 7 elemente.

VB

Option Base 1
Dim cheltuieli(7) As Double

De asemenea, puteți seta în mod explicit limita inferioară a unui tablou folosind o clauză To , așa cum se arată în exemplul următor.

VB

Dim cheltuieli(1 To 7) As Double

Folosirea matricilor de tip Variant

În exemplul precedent, vectorul cheltuieli poate stoca doar numere zecimale. Dacă dorim să stocăm valori de diverse tipuri de date intr-un vector, va trebui să declarăm vectorul de tip Variant. În exemplul următor declarăm un vector angajat în care vom stoca numele, adresa, vârsta și anul angajării

VB

Dim angajat(3)
angajat(0) = "Vasilica Gheorghe"
angajat(1) = "Zorilor 10"
angajat(2) = 29
angajat(3) = Format("06-09-2020", "General Date") 

Alocarea dinamică

Declararea unui vector sau matrici cu instrucțiunea Dim permite folosirea doar a numerelor pentru definirea limitei inferioare sau superioare a vectorului sau matricii. Dacă dorim dimensionarea dinamică a vectorului sau matricii funcție de valoarea unei variabile se folosește instrucțiunea ReDim.

VB

Dim angajati() As String
...
n = 10
ReDim angajati(n)

Remarcați că în instrucțiunea ReDim nu am mai declarat tipul de dată (As String). Declararea unui vector sau matrici cu alocare dinamică poate fi simplificată eliminând complet instrucțiunea Dim, ca mai jos:

VB

...
n = 10
ReDim angajati(n) As String

În acest caz folosim doar instrucțiunea ReDim pentru a declara și inițializa vectorul angajati cu limita superioară n, specificând și tipul de data (String).

Matrici

Dacă introduceți un singur număr între paranteze într-o instrucțiune Dim, VBA creează o matrice unidimensională (vector). Puteți crea matrici cu două sau mai multe dimensiuni (60 este maximul) declarand limitele superioare ale ficărei dimensiuni separate prin virgule. De exemplu, să presupunem că doriți să stocați atât numele, cât și prenumele în tabloul angajati. Pentru a stoca două seturi de date cu fiecare element, declarăm o matrice bidimensională, după cum urmează:

VB

Dim angajati(1 To 10, 1 To 2) As String
angajati (1, 1) = "Popescu"
angajati (1, 2) = "Mircea"
angajati (2, 1) = "Popescu"
angajati (2, 2) = "Nioara"

Declarația Dim de mai sus stabilește un "tabel" (sau o matrice) cu 10 rânduri (câte unul pentru fiecare angajat) și două "coloane" (unul pentru nume și unul pentru prenume).

Utilizați instrucțiuni imbricate For...Next pentru a procesa matrice multidimensionale. Următoarea procedură umple o matrice bidimensională cu valori Boolean.

VB

Sub Prezenta() 
	Dim i As Integer, j As Integer 
	Dim prezenta(1 To 5, 1 To 2) As Boolean
 
	For i = 1 To 5 
		For j = 1 To 2
			prezenta(i, j) = True
		Next j 
	Next i
End Sub

Transmiterea unei plaje de celule din Excel în VBA

Pentru a transmite valorile dintr-o plajă de celule din Excel în VBA, putem folosi obiectul Range (specific Excel, nu VBA). O funcție simplă care are ca parametru un obiect de tip Range este dat mai jos:

VB

Function Test(p As Range)
	Dim r As Integer, c As Integer, numar As Integer 
	r = p.Rows.Count
	c = p.Columns.Count 
	numar = p.Count
End Function

Obiectul Range, denumit p în exemplul de mai sus, are trei proprietăți care pot fi folosite pentru a afla dimensiunea selecției (plajei):

p.Rows.Count – returnează numărul de rânduri ale selecției, p.Columns.Count – returnează numărul de coloane ale selecției, respectiv p.Count – numărul de celule selectate.

Pentru a citi o plajă de celule unidimensionlă (pe un rând, sau o coloană) într-un vector, putem folosi procedura de mai jos:

VB

Function Test(p As Range)
	Dim i As Integer
	If p.Rows.Count = 1 Or p.Columns.Count = 1 Then 
		ReDim vect(1 To p.Count) As Double
		For i = 1 To p.Count
			vect(i) = p(i)
		Next i
	End If
End Function

Pentru a citi o plajă bidimensională, procedura este și mai simplă, folsind tipul de dată Variant.

VB

Function Test(p As Range)
	Dim m
	m = p 
End Function

Variabila m este declarată ca Variant și prin operațiunea de atribuire m = p, variabila va fi atât inițializată cât și umpută cu valorile din plaja de celule p. VBA va inițializa indicii inferiori ai matricii la 1, cum se vede în figura de mai jos.