Ovaj vodič će objasniti VBA niz, različite tipove nizova, varijantne nizove i metode niza uz pomoć primjera programiranja:
Obična VBA varijabla je držač mjesta koji pohranjuje vrijednost jednog podatka. Ima odnos 1 prema 1, tj. 1 varijabla za 1 vrijednost.
Sada zamislite da pohranjujete više vrijednosti koje su istog tipa. Umjesto stvaranja više varijabli, možete kreirati samo jednu varijablu i pohraniti sve iste vrste vrijednosti. Ova varijabla se zove NIZ.
U ovom vodiču, upoznaćete šta je VBA niz, jednodimenzionalni i dvodimenzionalni niz zajedno sa različitim tipovima nizova kao što su fiksni i dinamički. Također ćemo razumjeti različite metode niza koje se koriste u VBA.
VBA niz
Nizovi su posebna vrsta varijable koja može pohraniti više vrijednosti istog tipa podataka .
Na primjer, ako imate imena 100 zaposlenih, onda umjesto kreiranja 100 varijabli tipa podataka string, možete jednostavno kreirati jednu varijablu niza tipa string i dodijeliti 100 vrijednosti na istu varijablu niza.
Jednodimenzionalni niz
Niz koji ima sve elemente u jednom redu ili u jednoj koloni naziva se jednodimenzionalni niz. Navođenje imena svih učenika u razredu u jednoj koloni je primjer jednodimenzionalnog niza. Deklarisano je kao što je prikazanoniz je deklariran kao što je prikazano ispod.
Dim ArrayName(FirstIndex to LastIndex, FirstIndex to LastIndex) kao DataType.
Primjer: Dim oznake(1 do 3 , 0 do 2) Kao cijeli broj
Q #3) Kako pretvoriti raspon u niz?
Odgovor: Možemo koristiti funkciju transponiranja da konvertujete opseg u niz. Ovaj kod će kreirati Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
Q #4) Šta je varijanta niza u VBA?
Odgovor: Varijantni niz će prihvatiti sve vrste tipova podataka za svoj indeks, tj. možete pohraniti različite tipove vrijednosti u jedan niz.
Primjer:
Dim arrayData(3) As Variant
arrayData(0) = “Vikas Vipal”
arrayData(1) = 411234567890#
Načini za promjenu veličine niza tokom vrijeme izvođenja, kao i očuvanje vrijednosti pomoću redim očuvanja, raspravljalo se s primjerima. Konačno, naučili smo Array metode koje će nam pomoći u izvođenju nekoliko operacija.
ispod.Dim arrayname(lowerbound to UpperBound) As DataType
Postoji više načina da se deklarira niz. U nastavku je dato nekoliko primjera.
Primjer:
#1) Dim MyArrayExample(0 do 3) Kao cijeli broj
Kreira niz s lokacijom 0,1,2,3 koji će prihvatiti vrijednosti Integer.
#2) Dim MyArray2(3) As String
Zadano od 0 na 3 i kreira niz sa lokacijom 0,1,2,3 koji će prihvatiti string vrijednosti.
#3) Dim MyArray2(13 do 15) As Double
Kreira niz počevši od 13, tj. 13, 14 i 15, i prihvata dvostruke vrijednosti. Spomenuli smo donju granicu kao 13, tako da će niz početi dodjeljivati vrijednosti s lokacije 13 umjesto 0.
Kreirajmo jednostavan kod i razumijemo sva 3 načina deklaracije niza.
Napomena: Za pisanje VB koda Otvorite Microsoft Excel (podržane verzije su Excel 2007, 2010, 2013, 2016, 2019). Idite na Kartica za programere -> Visual Basic (Alternativno koristite prečicu Alt+F11). U VB editoru kliknite na Insert -> Modul i zalijepite donji kod.
Razmotrite donju proceduru koja prikazuje različite vrste deklaracija.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String ‘creates array with index 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "First Quarter in calendar " & " " & firstQuarter(0) & " " & firstQuarter(1) & " " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String ‘creates array with index 0,1,2 secondQuarter(0) = "April" secondQuarter(1) = "May" secondQuarter(2) = "June" MsgBox "Second Quarter in calendar " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String ‘creates array with index 13,14,15 thirdQuarter(13) = "July" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep" MsgBox "Third Quarter in calendar " & " " & thirdQuarter(13) & " " & thirdQuarter(14) & " " & thirdQuarter(15) End Sub
Pritisnite F5 ili pritisnite dugme za pokretanje na traci sa alatkama za izvršavanje koda.
Redovna varijabla protiv varijable niza
Sada znamo kako jednodimenzionalni niz funkcionira. Zato hajde da odvojimo trenutak da shvatimo zašto su nizovi tako ključniprogramski jezici.
Pretpostavimo da treba upisati platu 5 zaposlenih. Da biste to postigli korištenjem regularne varijable, trebate kreirati 5 varijabli.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Declare variable for each student Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Read student marks from cell 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 ' Print student marks Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Sada napravimo isti kod koristeći varijablu niza.
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
Ovdje, upravo smo koristili jednu varijablu niza koja će pohraniti sva imena zaposlenika. Pretpostavimo da trebate dodati još 100 imena zaposlenika onda samo trebate promijeniti veličinu niza i ne morate kreirati novu varijablu.
Ovo će smanjiti broj redaka u kodu i time ga olakšati razumljivo i čitljivo.
Dvodimenzionalni niz
2-dimenzionalni niz ima 2 indeksa – prvi indeks će predstavljati redove, a 2. indeks će predstavljati stupac. Ima više redaka i stupaca i obično je predstavljen u formatu tabele.
Deklaracija 2 dim polja je sljedeća:
Dim ArrayName(FirstIndex Na LastIndex, FirstIndex na LastIndex) Kao DataType.
Razmotrite primjer pohranjivanja ocjena 2 učenika dobijenih u 3 predmeta. Tako ćemo kreirati 2-dimenzionalni niz koji zauzima 2 reda i 3 stupca.
Pokrenut ćemo niz od reda 1 do reda 2 i stupca 1 do stupca 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
Pritisnite F5 ili Pritisnite dugme za pokretanje na traci sa alatkama da izvršite kod.
Red 2 i Kolona 2
Red 1 i kolona 3
Fiksni nizovi
Fiksni nizovi koji se nazivaju i statičkiNizovi imaju fiksnu donju i gornju granicu i ova veličina se ne može promijeniti u vremenu izvođenja. Veličina niza je specificirana tokom deklaracije unutar zagrada. Svi gornji primjeri su fiksni nizovi jer smo spomenuli njegovu veličinu tokom deklaracije.
Fiksni nizovi se obično koriste kada ste sigurni u veličinu niza. Na primjer, broj dana u sedmici, možete kreirati niz sa donjom granicom 0 i gornjom granicom 6 i biti sigurni da nikada nećete promijeniti njegovu veličinu.
Dinamički nizovi
Dinamički nizovi nam omogućavaju da promijenimo veličinu niza tokom vremena rada. Ovo je korisno kada niste sigurni u veličinu niza. Pretpostavimo da prilikom upisa na fakultet možda niste sigurni koliko će studenata zaista dobiti upis, tako da ne možete odrediti veličinu u vrijeme dizajna ili deklaracije.
Deklaracija dinamičkog niza je slična statičkom niz sa praznim zagradama.
Dim Employee() As String
REDIM
Kada želimo promijeniti veličinu, moramo koristiti REDIM , moramo napomenuti da se donja granica ne može promijeniti, možemo samo promijeniti gornju granicu niza.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ‘ Redim will help to change the array size during runtime dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are “ & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Sada, znamo da možemo promijenite veličinu niza tokom vremena izvršavanja, stoga možemo koristiti naredbu ReDim kad god treba da povećamo ograničenje niza. Pokušajmo još jednom povećati veličinu niza i dodati noviime učenika.
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 "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ‘ Redim will reinitialise the array and destroy the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Primijetili biste da rezultat ne prikazuje imena učenika dodanih ranije, daje nultu vrijednost. To je zato što će naredba Redim kreirati novi niz s novom veličinom i uništiti stare vrijednosti.
ReDim Preserve
Represerve izraz nam pomaže u prevazilaženju ograničenja ReDim-a očuvanjem starih vrijednosti i time povećavamo veličinu niza.
Prepišimo gornji kod koristeći 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 "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ‘ Redim preserve will retain the old values dynArray(3) = "John" MsgBox "Students Enrolled untill " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Kao što smo koristili Sačuvaj ključnu riječ, prethodno unesene vrijednosti se ne gube i nova vrijednost se uspješno dodaje.
Niz varijanti
Do sada smo vidjeli niz koji prihvaća isti tip vrijednosti. Sada deklarirajmo niz kao varijantu i pohranimo različite vrste podataka kao što su String, Date, Long, Integer u jednom nizu.
Primjer:
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 niza
Postoji nekoliko metoda u VBA nizovima koje će nam pomoći da izvodimo različite funkcije, kao što je navedeno u nastavku.
Sl. Br | Naziv | Sintaksa | Opis |
---|---|---|---|
1 | Niz | Niz(arglist) | Konvertuje regularnu varijantu varijable u niz. |
2 | Erase | Erase arrayname | Koristi se za ponovno pokretanje niza fiksne veličine i oslobađa memoriju za Dynamicniz. |
3 | IsArray | IsArray (ime varijable) | Određuje da li varijabla je niz. |
4 | Lbound | LBound( Ime polja, [Dimenzija] ) | Vraća najniži indeks niza. |
5 | Ubound | UBound( Ime polja , [Dimenzija] ) | Vraća najviši indeks niza. |
6 | Split | Split(expression, [ delimiter, [ limit, [ compare ]]]) | Ona dijeli niz na više podnizova i vraća niz zasnovan na nuli. |
7 | Join | Join(sourcearray, [ delimiter ]) | Spaja više podnizova u nizu i vraća vrijednost niza . |
8 | Filter | Filter(izvorni niz, podudaranje, [ uključi, [ uporedi ]]) | Filter će nam omogućiti da pretražimo specificirano podudaranje iz niza. |
Razgovarajmo o svakom od njih detaljno uz primjer.
#1) Niz
Deklarišemo regularnu varijantu i koristimo je kao niz. Kada želite promijeniti regularnu varijantnu varijablu u niz, moramo koristiti funkciju ARRAY kao što je prikazano u primjeru ispod.
Funkcije niza prihvataju argument koji sadrži vrijednosti razdvojene zarezima . Ove vrijednosti su dodijeljene kao element niza.
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
Morate identificirati varijablu niza koristeći indeks,stoga se u gornjem primjeru vrijednosti preuzimaju kao varData(0) varData(2) varData(3).
#2) Erase
Ova funkcija će izbrisati sve vrijednosti unesene za niz fiksne veličine i oslobodit će memorijski prostor za dinamički niz.
Sintaksa: Erase arrayname
Erase ima različito ponašanje za različite tipove podataka kao što je dato ispod.
- Za fiksni broj: Sve vrijednosti se vraćaju na nulu.
- Za tip podataka fiksnog niza: Sve vrijednosti se vraćaju na nultu dužinu.
- Za dinamički niz: Oslobađa memoriju koju koristi niz.
Primjer :
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 ' Free the memory ' All values are erased. MsgBox " Values after Erase " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Rezultat prije korištenja funkcije Erase
Rezultat nakon korištenja Erase
#3) IsArray
Ova funkcija se koristi za određivanje da li je data ulazna varijabla niz ili ne. Vraća true ako je unesena varijabla istinita, inače vraća false.
Sintaksa: IsArray (ime varijable)
Primjer:
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
Rezultat iz prvog Msgbox-a
Rezultat iz drugog msgbox-a
#4) Lbound
Vraća najniži indeks niza naveden kao argument za funkciju Lbound.
Sintaksa: LBound(Ime polja, [Dimenzija] )
Ime niza je ime niza.
Dimenzija je opciona cjelobrojna vrijednost, ako niz ima više dimenzija, tada možete odrediti dakoju dimenziju želite odrediti Lbound.
Primjer:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Returns 1. Result2 = LBound(ArrayValue, 3) ' Returns 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
To vraća gornji indeks niza naveden kao argument u funkciji Ubound.
Sintaksa: UBound( Ime polja, [Dimension] )
Ime polja je ime array.
Dimenzija je opciona cjelobrojna vrijednost, ako niz ima više dimenzija, tada možete odrediti koju dimenziju želite odrediti Ubound.
Primjer:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Declare array variables. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Lowest subscript in first array " & Result1 & " lowest subscript in 3rd array " & Result2 & " Lowest subscript in Arraywithoutlbound " & Result3 End Sub
#6) Split
Vraća niz s brojem podnizova izvedenih iz datog cijelog niza.
Sintaksa: Split(izraz, [ delimiter, [ ograničenje, [ uporedi ]]])
- Izraz: Ovo je cijeli niz koji će se koristiti za proizvesti podnizove.
- Razgraničitelj: Koristeći specificirani graničnik, podnizovi će se generirati. Ako ovo nije spomenuto, razmak se smatra graničnikom.
- Ograničenje: Broj podnizova koji se vraćaju.
- Uporedi: Nakon podniz je proizveden, možete koristiti različite opcije za poređenje da testirate rezultat.
Primjer: U primjeru ispod, koristimo graničnik kao – i ograničenje kao 3.
Stoga će funkcija split razdvojiti cijeli niz u podniz na osnovu graničnika. Ali smo također spomenuli granicu kao 3, tako da se podnizovi neće formirati nakon granice 3. Dakle, posljednji graničnik –će biti preskočeno.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "This is the example for-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Join
Ovo je samo obrnuto od podjele, Join će stvoriti jedan niz kombiniranjem nekoliko podnizova.
Sintaksa: Join(sourcearray, [ delimiter ])
Sourcearray: Jednodimenzionalni niz nizova koje želite spojiti u jedan.
Razgraničnik: Navedeni graničnik će biti dodat nakon svakog niza tokom spajanja.
Primjer:
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 "Date after joining " & Result End Sub
Sve 3 vrijednosti su spojeno i \ se stavlja između svake riječi, kao što smo spomenuli \ kao graničnik.
#8) Filter
Filter će nam omogućiti da tražiti određeno podudaranje iz niza. Na osnovu kriterijuma filtera, biće vraćen podskup niza nizova.
Sintaksa: Filter(izvorni niz, podudaranje, [ uključi, [ uporedi ]])
Primjer:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Software Testing", "Testing help", "Software help") filterString = Filter(Mystring, "help") MsgBox "Found " & UBound(Mystring) - LBound(Mystring) + 1 & " words matching the criteria " End Sub
Ovaj primjer će tražiti riječ “pomoć” u cijelom nizu niza koristeći funkciju filtera.
Često postavljana pitanja
P #1) Kako dobiti dužinu niza u VBA?
Odgovor: Da biste dobili dužinu niza array, koristimo funkciju Ubound. Ova funkcija će nam dati gornji indeks specificiranog niza.
Q #2) Kako deklarirati niz u VBA?
Odgovor: Jedan- dimenzionalni niz je deklariran kao što je prikazano ispod.
Dim arrayname(donja granica do gornje granice) Kao tip podataka
Primjer: Dim Myarray(0 do 2) kao cijeli broj
Dvodimenzionalni