Ta vadnica bo pokazala, kako razglasiti (zatemniti), ustvariti in inicializirati spremenljivke matrike v VBA
Kaj je spremenljivka matrike VBA?
Spremenljivko matrike VBA si lahko predstavljamo kot skupino spremenljivk, shranjenih pod istim imenom in z istim tipom podatkov. Polje lahko shrani besedilo, številke ali predmete.
Sklicujete se na element v matriki z njegovo indeksno številko.
Spremenljivko matrike lahko deklarirate na enak način kot katero koli drugo spremenljivko z uporabo ključne besede Dim, Static, Public ali Private.
Statični nizi
Obstajata 2 vrsti nizov - statični in dinamični. Statična matrika je razglašena z velikostjo, določeno, ko matriko na začetku deklarirate. Imenuje se tudi fiksni niz.
1 | Zatemni intA (4) kot celo število |
Zgornja matrika je deklarirana z uporabo stavka Dim na ravni postopka ali modula, velikost matrike pa je 5, saj nismo deklarirali vrednosti LBound matrike.
Ne, to ni pravopisna napaka! Velikost niza je 5, kljub vnosu 4 v matriko. To je zato, ker se indeksi nizov samodejno začnejo pri nič.
Indeksi nizov
Indeksi nizov se samodejno začnejo pri nič, razen če Osnovna možnost 1 je naveden na vrhu vašega kodnega modula.
Če Osnovna možnost 1 je deklarirano, potem se polja samodejno začnejo pri 1.
Vendar se mi zdi tako razglašanje spremenljivk problematično. Pregledovalci kode se morda ne zavedajo, da se polja začnejo pri nič ali pri deklaraciji Option Base 1
Namesto tega raje izrecno deklariram začetni in končni položaj nizov:
1 | Zatemni intA (2 do 5) kot celo število |
Upoštevajte, da lahko matrico zaženete pri poljubni številki (ne le 1 ali 0).
Dinamični nizi
Spremenljivka Dynamic Array je matrika, katere velikost je mogoče spreminjati med izvajanjem. Razglasite dinamične spremenljivke brez velikosti.
1 | Zatemni intA () kot celo število |
Z stavkom ReDim lahko določite velikost matrike po ustvarjanju matrike.
1 | ReDim intA (2) |
Dinamično matriko lahko kadar koli spremenite. Vendar se pri uporabi izjave ReDim vse obstoječe vrednosti izbrišejo. Če želite ohraniti obstoječe vrednosti matrike, uporabite ReDim Preserve namesto tega.
1 | ReDim Preserve intA (2) |
Dinamično matriko lahko razglasite na ravni postopka, modula ali globalne ravni, vendar lahko uporabite samo stavek ReDim v postopku.
Različni nizi
Različice matrike so dinamične matrike, s katerimi je lažje delati.
1 | Dim varNames () |
Upoštevajte, da vam ni treba določiti vrste podatkov (predpostavlja se, da je različica) ali velikosti matrike.
Kot bomo videli spodaj, lahko variabilne matrike inicializirate s funkcijo Array (ni treba najprej spreminjati velikosti nizov)!
Razglasi modul in javne matrike
Kot je prikazano zgoraj, je mogoče matrike prijaviti v postopkih za uporabo v tem postopku:
1234 | Sub StaticArray ()'razglasite niz z vrednostjo LBound 1 in vrednostjo UBound 4Zatemni IntA (1 do 4) kot celo številoEnd Sub |
Lahko pa jih razglasimo tudi na ravni modula ali na globalni ravni.
1234567 | Možnost izrecno'razglasite niz z vrednostjo LBound 1 in vrednostjo UBound 4Zatemni IntA (1 do 4) kot celo številoSub StaticArray ()End Sub |
V tem primeru lahko spremenljivko matrike pokličete kjer koli v tem kodnem modulu. Namesto tega lahko razglasite javno matriko, ki jo lahko uporabljate v celotnem projektu VBA (glejte naslednji razdelek).
Razglasitev javnega polja
Javno statično polje deklarirate tako, kot bi deklarirali javno spremenljivko.
1 | Javna imena str (3) kot niz |
Ta izjava bi morala iti na vrh vašega modula, pod možnostjo Explicit. Nato bi ga lahko uporabili v celotnem projektu VBA v katerem koli modulu ali postopku.
Če označite polje na vrhu modula, vendar s ključno besedo Dim, je uporaba tega niza omejena na posamezni modul. Poskus uporabe polja v ločenem modulu bi povzročil napako.
Inicializirajte matrike
Statičnemu nizu lahko dodelite vrednosti na naslednji način.
1234567891011 | Sub StaticArray ()'razglasite niz z vrednostjo LBound 1 in vrednostjo UBound 4Zatemni IntA (1 do 4) kot celo število'inicializirajte matrikoIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'prikaži rezultat položaja 2 matrike v neposrednem oknuDebug.Print IntA (2)End Sub |
Če zaženete zgornji postopek, bo vrednost 20 prikazana v neposrednem oknu.
Vrednosti lahko na enak način dodelite tudi dinamičnemu nizu
12345678910111213 | Sub DynamicArray ()'razglasi dinamično matriko, pri tem pa izpusti vezane vrednostiZatemni IntA () kot celo število'inicializirajte matrikoReDim IntA (1 do 4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'prikaži rezultat položaja 2 matrike v neposrednem oknuOdpravljanje napakIntA (2)End Sub |
Funkcija niza
Vendar pa samo z različno matriko, lahko uporabite funkcijo matrike, ki je morda lažja od uporabe standardne metode.
12 | 'napolni matrikointA () = Niz (10, 20, 30, 40) |
Napolni niz z zanko
Polje lahko napolnite tudi tako, da prelistate vrsto celic v Excelu
1234567891011121314151617 | Pod TestDynamicArrayFromExcel ()'razglasi matrikoDim strNames () Kot niz'deklarirajte celo število za štetje vrstic v obseguDim n kot celo število'razglasi celo število za zankoDim i kot celo število'štejte vrstice v obsegun = Razpon ("A1", Razpon ("A1"). Konec (xlDown)). Vrstice. Število'pomanjšajte matriko na količino vrstic v obsegu.ReDim strNames (n)Za i = 0 Za nstrNames (i) = Obseg ("A1"). Odmik (i + 1, 0)Naprej i'prikaži vrednosti v matrikiPridruži se MsgBox (strNames ())End Sub |
Znova inicializirajte matrike
Polje lahko znova inicializirate na kateri koli stopnji kode, vendar boste izgubili prvotno vrednost, ki jo vsebuje ta položaj v matriki.
1234567891011121314 | Sub StaticArray ()'razglasite niz z vrednostjo LBound 1 in vrednostjo UBound 4Zatemni IntA (1 do 4) kot celo število'inicializirajte matrikoIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'prikaži rezultat položaja 2 matrike v neposrednem oknuDebug.Print IntA (2)'znova inicializirajte matrikointA (2) = 200Debug.Print IntA (2)End Sub |
V zgornjem primeru bo statična matrika ohranila vse vrednosti, razen vrednosti v položaju 2 - ta vrednost se bo spremenila v 200.
Uporaba programa ReDim
Če uporabljate dinamični niz, se izjava ReDim uporablja za nastavitev velikosti vašega niza. Nato lahko v kodi uporabite stavek ReDim, da velikost matrike spremenite tolikokrat, kot je potrebno. Spodnja vrstica kode bo ponovno inicializirala matriko intA v velikosti 2 (Ne pozabite - indeks matrike se začne pri 0!)
1 | ReDim intA (1) kot celo število |
Tako bi bila koda, vključno z izjavo ReDim, videti kot spodnji primer.
1234567891011121314151617 | Pod TestDynamicArray ()'razglasi matrikoZatemni intA () kot celo številoReDim intA (2)'napolni matriko s številkamiintA (0) = 2intA (1) = 5intA (2) = 9'pokaži številko na položaju 1Odpravljanje napak intA (1)'pomanjšajte matriko, da spremenite velikostReDim intA (3)intA (0) = 6intA (1) = 8'tokrat prikaži številko na položaju 1Debug.Print intA (1)End Sub |
Če zaženete zgornji postopek, bi bila vrednost 5 prikazana v neposrednem oknu, nato pa bi bila prikazana vrednost 8, ko bi z matrico ReDim spremenili velikost matrike in jo ponovno napolnili. Ker pa nismo zapolnili IntA (2) in nismo uporabili možnosti Re-Dim Preserve, bo vrednost v tem položaju v matriki odstranjena, oba položaja 3 in 4 v matriki pa bosta nič.
Uporaba ReDim Preserve
Če uporabljamo ReDim Preserve, bo ohranil prvotne vrednosti, ki jih vsebuje matrika.
1234567891011121314151617 | Pod TestDynamicArray ()'razglasi matrikoZatemni intA () kot celo številoReDim intA (2)'napolni matriko s številkamiintA (0) = 2intA (1) = 5intA (2) = 9'pokaži številko na položaju 2Odpravljanje napak intA (2)'pomanjšaj matrikoReDim intA (3)intA (0) = 6intA (1) = 8'ponovno pokaži številko na položaju 2Debug.Print intA (2)End Sub |
V obeh zgoraj prikazanih poljih za sporočila bo številka 9 prikazana, saj stavek ReDim Preserve ohranil to vrednost na tem mestu.