Acest tutorial va explica VBA Array, diferite tipuri de array, array variante și metode de array cu ajutorul unor exemple de programare:
O variabilă VBA obișnuită este un suport care stochează valoarea unei singure date. Ea are o relație 1 la 1, adică 1 variabilă pentru 1 valoare.
Acum imaginați-vă că stocați mai multe valori de același tip. În loc să creați mai multe variabile, puteți crea doar o singură variabilă și să stocați toate valorile de același tip. Această variabilă se numește ARRAY.
În acest tutorial, veți afla ce este un array VBA, array-uri unidimensionale și bidimensionale, precum și diferitele tipuri de array-uri, cum ar fi Fixed și Dynamic. De asemenea, vom înțelege diverse metode de array-uri care sunt utilizate în VBA.
VBA Array
Array-urile sunt un tip special de variabile care pot stoca mai multe valori de același tip de date.
De exemplu, dacă aveți numele a 100 de angajați, în loc să creați 100 de variabile de tip string, puteți crea doar o variabilă de tip array de tip string și să atribuiți 100 de valori la aceeași variabilă array.
Array unidimensional
Un tablou care are toate elementele pe un singur rând sau pe o singură coloană se numește tablou unidimensional. Listarea numelor tuturor elevilor din clasă pe o singură coloană este un exemplu de tablou unidimensional. Acesta este declarat după cum se arată mai jos.
Dim arrayname(lowerbound To UpperBound) As DataType
Există mai multe moduri de a declara un array. Mai jos sunt prezentate câteva exemple.
Exemplu:
#1) Dim MyArrayExample(0 To 3) As Integer
Creează o matrice cu locația 0,1,2,3 care acceptă valori întregi.
#2) Dim MyArray2(3) As String
Valoarea implicită este de la 0 la 3 și creează o matrice cu locația 0,1,2,3 care acceptă valori String.
#3) Dim MyArray2(13 până la 15) ca dublu
Creează o matrice începând de la 13, adică 13, 14 și 15, și acceptă valori duble. Am menționat că limita inferioară este 13, astfel încât matricea va începe să aloce valori de la locația 13 și nu de la 0.
Să creăm un cod simplu și să înțelegem toate cele 3 moduri de declarare a tablourilor.
Notă: Pentru a scrie codul VB Deschideți Microsoft Excel (versiunile acceptate sunt Excel 2007, 2010, 2013, 2016, 2019). Navigați la Tabul Dezvoltator -> Visual Basic (Alternativ, utilizați comanda rapidă Alt+F11). În editorul VB, faceți clic pe Inserare -> Modul și inserați codul de mai jos.
Luați în considerare procedura de mai jos, care prezintă diferitele tipuri de declarații.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String 'creează o matrice cu indexul 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "Primul trimestru în calendar " & " " & firstQuarter(0) & " & " & firstQuarter(1) & " & " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String 'creează o matrice cu indexul 0,1,2secondQuarter(0) = "Aprilie" secondQuarter(1) = "Mai" secondQuarter(2) = "Iunie" MsgBox "Al doilea trimestru în calendar " & " " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String 'creează un array cu indexul 13,14,15 thirdQuarter(13) = "Iulie" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep"MsgBox "Al treilea trimestru în calendar " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " & thirdQuarter(15) End Sub
Apăsați F5 sau apăsați butonul run din bara de instrumente pentru a executa codul.
Variabila obișnuită vs variabila de matrice
Acum știm cum funcționează o matrice unidimensională, așa că haideți să ne oprim puțin pentru a înțelege de ce matricele sunt atât de importante în limbajele de programare.
Să presupunem că trebuie să introduceți salariul a 5 angajați. Pentru a realiza acest lucru folosind o variabilă obișnuită, trebuie să creați 5 variabile.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Declară variabila pentru fiecare student Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Citește notele studenților din celulă Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" &5).Value Emp5 = shet.Range("A" & 6).Value ' Imprimă notele elevilor Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Acum, să construim același cod folosind o variabilă Array.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Aici, am folosit doar o variabilă de tip array care va stoca toate numele angajaților. Presupunând că aveți nevoie să adăugați încă 100 de nume de angajați, atunci trebuie doar să modificați dimensiunea array-ului și nu trebuie să creați o nouă variabilă.
Acest lucru va reduce numărul de linii din cod și, prin urmare, îl va face ușor de înțeles și de citit.
Array bidimensional
O matrice bidimensională are 2 indici - primul indice va reprezenta rândurile, iar al doilea indice va reprezenta coloana. Aceasta are mai multe rânduri și coloane și este reprezentată de obicei în format tabelar.
Declararea unei matrice de 2 dimensiuni este următoarea:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Să luăm un exemplu de stocare a notelor obținute de 2 studenți la 3 materii. Vom crea o matrice bidimensională care are 2 rânduri și 3 coloane.
Vom începe matricea de la rândul 1 la rândul 2 și de la coloana 1 la coloana 3.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Total Marks in Row 2 and column 2 is " &totalMarks(2,2) Msgbox "Total Marks in Row 1 and column 3 is " &totalMarks(1,3) End Sub
Apăsați F5 sau apăsați butonul run din bara de instrumente pentru a executa codul.
Rândul 2 și coloana 2
Rândul 1 și coloana 3
Array-uri fixe
Array-urile fixe, denumite și Array-uri statice, au o limită inferioară și o limită superioară fixe, iar această dimensiune nu poate fi modificată în timpul execuției. Dimensiunea array-ului este specificată în timpul declarației, între paranteze. Toate exemplele de mai sus sunt Array-uri fixe, deoarece am menționat dimensiunea lor în timpul declarației.
Tablourile fixe sunt utilizate de obicei atunci când sunteți sigur de dimensiunea tabloului. De exemplu, numărul de zile dintr-o săptămână, puteți crea un tablou cu limita inferioară 0 și limita superioară 6 și să fiți sigur că nu-i veți modifica niciodată dimensiunea.
Array-uri dinamice
Array-urile dinamice ne permit să redimensionăm array-ul în timpul execuției. Acestea sunt utile atunci când nu sunteți sigur de dimensiunea array-ului. Să presupunem că, în cazul admiterii la facultate, este posibil să nu fiți sigur de câți studenți vor fi admiși, deci nu puteți determina dimensiunea în momentul proiectării sau al declarației.
Declararea unui tablou dinamic este similară cu cea a unui tablou static cu paranteze goale.
Dim Employee() As String
REDIM
Atunci când dorim să schimbăm dimensiunea trebuie să folosim REDIM , trebuie să observăm că limita inferioară nu poate fi modificată, ci doar limita superioară a matricei.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim va ajuta la modificarea dimensiunii tabloului în timpul execuției dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Studenții înscriși după " & curdate &; curamp; " sunt " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Acum, știm că putem modifica dimensiunea tabloului în timpul execuției, prin urmare putem utiliza instrucțiunea ReDim ori de câte ori avem nevoie să mărim dimensiunea unui tablou. Să încercăm să mărim dimensiunea tabloului încă o dată și să adăugăm un nou nume de student.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Studenții înscriși până la " & curdate &; " sunt " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ' Redim va reinitializa array-ul și va distruge vechile valori.dynArray(3) = "John" MsgBox "Studenții înscriși până la " & curdate & " sunt " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Ați observat că rezultatul nu arată numele studenților adăugați anterior, ci oferă o valoare nulă. Acest lucru se datorează faptului că instrucțiunea Redim va crea un nou array cu o nouă dimensiune și va distruge vechile valori.
ReDim Preserve
Instrucțiunea Represerve ne ajută să depășim limitarea lui ReDim prin păstrarea vechilor valori și, astfel, prin creșterea dimensiunii tabloului.
Să rescriem codul de mai sus folosind ReDim Preserve.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Studenții înscriși până la " & curdate &; " sunt " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ' Redim preserve va păstra vechile valori.dynArray(3) = "John" MsgBox "Studenții înscriși până la " & curdate & " sunt " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Deoarece am utilizat cuvântul cheie preserve, valorile introduse anterior nu se pierd, iar noua valoare este adăugată cu succes.
Array de variante
Până acum am văzut o matrice care acceptă același tip de valori. Acum să declarăm matricea ca variantă și să stocăm diferite tipuri de date precum String, Date, Long, Integer într-o singură matrice.
Exemplu:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Details of person " & arrayData(0) & " is " & " Phone No " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
Metode VBA Array
Există mai multe metode în array-urile VBA care ne vor ajuta să efectuăm diferite funcții, după cum se menționează mai jos.
Sl. nr. | Nume | Sintaxa | Descriere |
---|---|---|---|
1 | Array | Array(arglist) | Convertește o variantă obișnuită într-o matrice. |
2 | Ștergeți | Șterge numele matricei | Folosit pentru a reintializa matricea de dimensiune fixă și eliberează memoria pentru Dynamic array. |
3 | IsArray | IsArray (variablename) | Determină dacă o variabilă este o matrice. |
4 | Lbound | LBound( ArrayName, [Dimension] ) | Returnează cel mai mic indice a unei matrice. |
5 | Ubound | UBound( ArrayName, [Dimension] ) | Returnează cel mai mare indice a unei matrice. |
6 | Split | Split(expresie, [ delimitator, [ limită, [ comparații ]]]]) | Acesta împarte un șir de caractere în mai multe subșiruri și returnează o matrice bazată pe zero. |
7 | Alăturați-vă | Join(sourcearray, [ delimitator ]) | Unește mai multe subșiruri dintr-un tablou și returnează o valoare de șir de caractere. |
8 | Filtru | Filter(sourcearray, match, [ include, [ compare ]]]) | Filtru ne va permite să căutăm un specificată dintr-o matrice. |
Să discutăm fiecare dintre ele în detaliu cu un exemplu.
#1) Array
Haideți să declarăm o variabilă variantă obișnuită și să o folosim ca un array. Atunci când doriți să transformați o variabilă variantă obișnuită într-un array, trebuie să folosim o variabilă ARRAY așa cum se arată în exemplul de mai jos.
Funcțiile array acceptă un argument care conține valori separate prin virgulă. Aceste valori sunt atribuite ca element al array-ului.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Details of person " & varData(0) & " is " & " Phone No " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Trebuie să identificați o variabilă de matrice folosind un index, prin urmare, în exemplul de mai sus, valorile sunt recuperate ca varData(0) varData(2) varData(3).
#2) Ștergeți
Această funcție va șterge toate valorile introduse pentru o matrice de dimensiune fixă și va elibera spațiul de memorie pentru o matrice dinamică.
Sintaxă: Erase arrayname
Ștergerea are un comportament diferit pentru diferite tipuri de date, după cum se arată mai jos.
- Pentru un număr fix: Toate valorile sunt resetate la zero.
- Pentru un tip de date de tip șir fix: Toate valorile sunt resetate la lungimea zero.
- Pentru o matrice dinamică: Eliberează memoria utilizată de matrice.
Exemplu:
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Values before Erase " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Eliberați memoria ' Allvalorile sunt șterse. MsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Rezultatul înainte de utilizarea funcției de ștergere
Rezultatul după utilizarea Erase
#3) IsArray
Această funcție este utilizată pentru a determina dacă variabila de intrare dată este sau nu o matrice. Aceasta returnează true dacă variabila introdusă este adevărată, iar în caz contrar returnează false.
Sintaxă : IsArray (variablename)
Exemplu:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2))) End
Rezultatul din primul Msgbox
Rezultatul celui de-al doilea msgbox
#4) Lbound
Aceasta returnează cel mai mic indice al matricei specificate ca argument pentru funcția Lbound.
Sintaxă: LBound( ArrayName, [Dimension] )
ArrayName este numele tabloului.
Dimensiunea este o valoare întreagă opțională; dacă matricea are mai multe dimensiuni, puteți specifica la ce dimensiune doriți să determinați Lbound.
Exemplu:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declarați variabilele de matrice. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Returnează 1. Result2 = LBound(ArrayValue, 3) ' Returnează 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Cel mai mic indice din prima matrice " & Result1 & " cel mai mic indice din a 3-a matrice " & Result2 & " Cel mai micsubscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Aceasta returnează indicele superior al matricei specificate ca argument în funcția Ubound.
Sintaxă: UBound( ArrayName, [Dimension] )
ArrayName este numele tabloului.
Dimensiunea este o valoare întreagă opțională; dacă matricea are mai multe dimensiuni, puteți preciza care este dimensiunea în funcție de care doriți să determinați Ubound.
Exemplu:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declarați variabilele de matrice. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Cel mai mic indice din prima matrice " & Result1 & " cel mai mic indice din a 3-a matrice " & Result2 & " Cel mai mic indice dinArraywithoutlbound " & Result3 End Sub
#6) Split
Aceasta returnează o matrice cu un număr de subșiruri derivate din șirul întreg dat.
Sintaxă: Split(expresie, [ delimitator, [ limită, [ comparații ]]]])
- Expresie: Acesta este șirul întreg care va fi utilizat pentru a produce subșiruri.
- Delimitator: Utilizând delimitatorul specificat, vor fi generate subșiruri. Dacă acesta nu este menționat, atunci spațiul este considerat ca fiind delimitator.
- Limită: Numărul de subșiruri care trebuie returnate.
- Comparați: După ce este produsă subșirul, puteți utiliza diferite opțiuni de comparare pentru a testa rezultatul.
Exemplu: În exemplul de mai jos, folosim delimitatorul ca - și limita ca 3.
Prin urmare, funcția de divizare va separa întregul șir de caractere în subșiruri pe baza delimitatorului. Dar am menționat și limita de 3, astfel încât subșirurile nu vor fi formate după limita de 3. Astfel, ultimul delimitator - va fi sărit.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "Acesta este exemplul pentru-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Alăturați-vă
Acesta este doar inversul divizării, Join va crea un singur șir de caractere prin combinarea mai multor subșiruri.
Sintaxă: Join(sourcearray, [ delimitator ])
Sourcearray: Matrice unidimensională de șiruri de caractere pe care doriți să le uniți într-unul singur.
Delimitator: Delimitatorul specificat va fi adăugat după fiecare șir de caractere în timpul îmbinării.
Exemplu:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Data după alăturare " & Result End Sub
Toate cele 3 valori sunt unite și \ este plasat între fiecare cuvânt, deoarece am menționat \ ca delimitator.
#8) Filtru
Filtrul ne va permite să căutăm o potrivire specificată dintr-un tablou. Pe baza criteriilor de filtrare, va fi returnat subsetul unui tablou de șiruri de caractere.
Sintaxă: Filter(sourcearray, match, [ include, [ compare ]]])
Exemplu:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Găsit " & UBound(Mystring) - LBound(Mystring) + 1 & " cuvinte care corespund criteriilor " End Sub
Acest exemplu va căuta cuvântul "help" în toate șirurile din matrice folosind funcția de filtrare.
Întrebări frecvente
Î #1) Cum se obține lungimea unui array în VBA?
Răspuns: Pentru a obține lungimea unui tablou, folosim funcția Ubound. Această funcție ne va oferi un indice superior al unui tablou specificat.
Î #2) Cum se declară o matrice în VBA?
Răspuns: Matricea unidimensională este declarată așa cum se arată mai jos.
Dim arrayname(lowerbound To UpperBound) As DataType
Exemplu: Dim Myarray(0 la 2) ca întreg
O matrice bidimensională este declarată după cum se arată mai jos.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Exemplu: Dim marks(1 To 3, 0 To 2) As Integer
Î #3) Cum se convertește intervalul în array?
Răspuns: Putem folosi funcția Transpose pentru a converti intervalul într-un array. Acest cod va crea Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10"))) End Sub
Î #4) Ce este o variantă de matrice în VBA?
Răspuns: O matrice variantă va accepta toate tipurile de date pentru indexul său, adică puteți stoca diferite tipuri de valori într-o singură matrice.
Exemplu:
Dim arrayData(3) ca variantă
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Au fost discutate, cu ajutorul unor exemple, modalitățile de redimensionare a array-ului în timpul execuției și, de asemenea, de păstrare a valorilor folosind redim preserve. În final, am învățat metodele Array care ne vor ajuta la efectuarea mai multor operații.