Aplikaziorako Visual Basic-en matrizeak

Visual Basic for Application-en matrizeak normalean mota bereko erlazionatutako aldagaien multzoak gordetzen dituzten egiturak dira. Array-eko sarreretara beren zenbakizko indizearen bidez sartzen da.

Esaterako, 20 laguneko talde bat dago zeinen izenak gorde behar dira gero VBA kodean erabiltzeko. Besterik gabe, 20 aldagai deklaratu daitezke izen bakoitzari eusteko, honela:

Dim Team_Member1 String gisa Dim Team_Member2 String gisa ... Dim Team_Member20 String gisa

Baina modu askoz errazagoa eta antolatuagoa erabil dezakezu: gorde taldekideen izenen zerrenda 20 aldagairen sorta batean. String:

Dim Team_Members(1 To 20) String gisa

Goian agertzen den lerroan, array bat deklaratu dugu. Orain idatz diezaiogun balio bat bere elementu bakoitzari, honela:

Team_Members(1) = "John Smith"

Datuak array batean gordetzearen abantaila gehigarri bat, aldagai bereiziak erabiltzearekin alderatuta, agerian geratzen da arrayko elementu bakoitzean ekintza bera egitea beharrezkoa denean. Taldekideen izenak 20 aldagai ezberdinetan gordeko balira, orduan 20 kode lerro beharko lirateke idazteko bakoitzean ekintza bera egiteko. Hala ere, izenak array batean gordetzen badira, haietako bakoitzarekin nahi duzun ekintza egin dezakezu begizta sinple bat erabiliz.

Nola funtzionatzen duen behean erakusten da taldekide bakoitzaren izenak zutabe-gelaxketan sekuentzialki inprimatzen dituen kode-adibide batekin. A Excel laneko orri aktiboa.

For i = 1 To 20 Cells(i,1).Value = Team_Members(i) Next i

Jakina, 20 izen gordetzen dituen array batekin lan egitea askoz gutxiago eta zehatzagoa da 20 aldagai bereizi erabiltzea baino. Baina zer gertatzen da izen hauek 20 ez badira, 1000 baizik? Eta, horrez gain, abizenak eta patronimikoak bereizita gordetzea eskatzen bada?! Argi dago laster ezinezkoa izango dela VBA kodean halako datu-bolumen bat kudeatzea array baten laguntzarik gabe.

Dimentsio anitzeko matrizeak Excel Visual Basic-en

Goian aztertutako Visual Basic arrayak dimentsio bakarrekoak dira. Horrek esan nahi du izen-zerrenda soil bat gordetzen dutela. Hala ere, matrizeek hainbat dimentsio izan ditzakete. Adibidez, bi dimentsioko array bat balioen sareta batekin aldera daiteke.

Demagun urtarrileko eguneroko salmenten zifrak gorde nahi dituzula 5 talde ezberdinentzat. Horretarako, 5 metrika multzoz osatutako bi dimentsioko array bat beharko da 31 egunez. Adieraz dezagun honelako array bat:

Dim Jan_Sales_Zifrak (1etik 31ra, 1etik 5era) Moneta gisa

Array-elementuetara sartzeko Urtarrila_Sales_zifrak, hilabeteko eguna eta komando zenbakia adieraziz bi indize erabili behar dituzu. Adibidez, salmenta-zifrak dituen elementu baten helbidea 2-o taldeentzat 15ean Urtarrila honela idatziko litzateke:

Urtarrila_Salmenta_zifrak(15, 2)

Modu berean, 3 dimentsio edo gehiago dituen array bat deklara dezakezu; besterik gabe, gehitu dimentsio gehigarriak array-adierazpenari eta erabili indize gehigarriak array honetako elementuei erreferentzia egiteko.

Array deklaratzea Excel Visual Basic-en

Artikulu honetan lehenago, VBAn matrizeak deklaratzeko hainbat adibide ikusi ditugu, baina gai honek hurbilagotik aztertzea merezi du. Ikusten den bezala, dimentsio bakarreko array bat honela deklara daiteke:

Dim Team_Members(1 To 20) String gisa

Adierazpen horrek VBA konpilatzaileari array hori esaten dio Talde_kideak 20etik 1rako indizeetan atzi daitezkeen 20 aldagai ditu. Hala ere, gure matrizearen aldagaiak 0tik 19ra zenbakitzea pentsa genezake, kasu horretan matrizea honela deklaratu beharko litzateke:

Dim Team_Members(0 To 19) String gisa

Izan ere, lehenespenez, matrizeko elementuen zenbaketa 0tik hasten da, eta array-adierazpenean, baliteke hasierako indizea batere zehaztu gabe egotea, honela:

Dim Team_Members(19) String gisa

VBA konpilatzaileak 20tik 0rako indizeak dituen 19 elementuko array bat deklaratuko du sarrera hori.

Arau berdinak aplikatzen dira dimentsio anitzeko Visual Basic arrayak deklaratzean. Adibideetako batean jada erakusten den bezala, bi dimentsioko array bat deklaratzean, bere dimentsioen indizeak komaz bereizten dira:

Dim Jan_Sales_Zifrak (1etik 31ra, 1etik 5era) Moneta gisa

Hala ere, matrizearen bi dimentsioetarako hasierako indizerik zehazten ez baduzu eta honela deklaratzen baduzu:

Dim Jan_Sales_Figures(31, 5) Moneta gisa

ondoren, sarrera hau bi dimentsioko array gisa tratatuko da, lehen dimentsioak 32tik 0rako indizeak dituzten 31 elementu dituena, eta matrizearen bigarren dimentsioak 6tik 0era bitarteko indizeak dituzten 5 elementu ditu.

Matrize dinamikoak

Goiko adibideetako matrize guztiek dimentsio kopuru finko bat dute. Hala ere, kasu askotan ez dakigu aldez aurretik gure array-ak zein tamaina izan behar duen. Egoeratik atera gaitezke array handi bat deklaratuz, zeinaren tamaina, zalantzarik gabe, gure zereginerako beharrezkoa baino handiagoa izango dena. Baina horrelako irtenbide batek memoria gehigarri asko beharko du eta programa moteldu dezake. Irtenbide hobea dago. Matrize dinamiko bat erabil dezakegu: makro bat exekutatzen den bitartean tamaina edozein aldiz ezarri eta alda daitekeen array bat da.

Array dinamiko bat parentesi hutsekin deklaratzen da, honela:

Dim Team_Members() String gisa

Ondoren, arrayaren dimentsioa deklaratu beharko duzu kodea exekutatzeko garaian adierazpena erabiliz ReDim:

ReDim Team_Members (1etik 20ra)

Eta kodea exekutatzen ari zaren bitartean matrizearen tamaina berriro aldatu behar baduzu, orduan berriro erabil dezakezu ReDim adierazpena:

Talde_tamaina > 20 bada, aldatu Talde_kideak (1 Talde_Tamainaraino) Amaitu bada

Kontuan izan matrize dinamiko bat modu honetan tamainaz aldatzea matrizean gordetako balio guztiak galtzea eragingo duela. Dagoeneko datuak matrizean gordetzeko, gako-hitza erabili behar duzu Ganboabehean agertzen den bezala:

Talde_Tamaina > 20 bada, Berriz Gorde Talde_kideak (1 Talde_Tamainaraino) Amaitu bada

Zoritxarrez gako-hitza Ganboa array-dimentsio baten goiko muga aldatzeko soilik erabil daiteke. Array baten beheko muga ezin da era honetan aldatu. Gainera, matrizeak dimentsio anitz baditu, gako-hitza erabili Ganboa, arrayaren azken dimentsioa bakarrik tamainaz alda daiteke.

Utzi erantzun bat