tartalom
A Visual Basic for Application tömbjei olyan struktúrák, amelyek jellemzően azonos típusú kapcsolódó változók készleteit tárolják. A tömbbejegyzések a numerikus indexük alapján érhetők el.
Például van egy 20 fős csapat, akiknek a nevét el kell menteni a későbbi VBA-kódban való használatra. Egyszerűen deklarálhatunk 20 változót minden név megtartásához, így:
Dim Team_Member1 As String Dim Team_Member2 As String ... Dim Team_Member20 As String
De használhat egy sokkal egyszerűbb és szervezettebb módszert is – tárolja a csapattagok névlistáját egy 20 változóból álló tömbben, mint pl. Húr:
Dim Team_Members (1-től 20-ig) karakterláncként
A fent látható sorban deklaráltunk egy tömböt. Most minden eleméhez írjunk egy értéket, például:
Team_Members(1) = "Kovács János"
Az adatok tömbben való tárolásának további előnye a különálló változók használatához képest akkor válik nyilvánvalóvá, ha a tömb minden elemén ugyanazt a műveletet kell végrehajtani. Ha a csapattagok neveit 20 különálló változóban tárolnánk, akkor minden alkalommal 20 sornyi kódra lenne szükség ahhoz, hogy ugyanazt a műveletet végrehajtsuk mindegyiken. Ha azonban a nevek egy tömbben vannak tárolva, akkor mindegyikkel elvégezheti a kívánt műveletet egy egyszerű ciklus segítségével.
Ennek működését az alábbiakban egy kódpéldával szemléltetjük, amely az egyes csapattagok nevét egymás után kiírja az oszlopcellákba. A aktív Excel munkalap.
Ha i = 1–20 cella(i,1). Érték = Csapat_tagok(i) Következő i
Nyilvánvalóan egy 20 nevet tároló tömbbel dolgozni sokkal kevésbé körülményes és pontosabb, mint 20 különálló változó használata. De mi van akkor, ha ezek a nevek nem 20, hanem 1000? És ha ezen kívül kötelező a vezeték- és a családnevek külön tartása?! Nyilvánvaló, hogy hamarosan teljesen lehetetlenné válik ekkora mennyiségű adat kezelése VBA-kódban tömb segítsége nélkül.
Többdimenziós tömbök az Excel Visual Basic programban
A fent tárgyalt Visual Basic tömbök egydimenziósnak tekinthetők. Ez azt jelenti, hogy egy egyszerű névlistát tárolnak. A tömbök azonban több dimenzióval is rendelkezhetnek. Például egy kétdimenziós tömb összehasonlítható egy értékek rácsával.
Tegyük fel, hogy el szeretné menteni 5 különböző csapat januári napi eladási adatait. Ehhez egy kétdimenziós tömbre lesz szükség, amely 5 mérőszámkészletből áll 31 napig. Deklaráljunk egy ilyen tömböt:
Halvány január_értékesítési_számok (1-től 31-ig, 1-től 5-ig) pénznemként
A tömbelemek eléréséhez Jan_Sales_figures, két indexet kell használnia, amelyek a hónap napját és a parancs számát jelzik. Például egy olyan elem címe, amely a következő értékesítési adatait tartalmazza 2-ó csapatok számára 15-án A januárt így írják:
Jan_Sales_figures(15, 2)
Ugyanígy deklarálhat egy tömböt 3 vagy több dimenzióval – csak adjon hozzá további dimenziókat a tömbdeklarációhoz, és használjon további indexeket a tömb elemeire való hivatkozáshoz.
Tömbök deklarálása az Excel Visual Basic programban
Korábban ebben a cikkben már több példát is megvizsgáltunk a tömbök VBA-ban való deklarálására, de ez a téma megérdemel egy közelebbi vizsgálatot. Mint látható, egy egydimenziós tömb a következőképpen deklarálható:
Dim Team_Members (1-től 20-ig) karakterláncként
Egy ilyen deklaráció közli a VBA-fordítóval, hogy a tömb Csapattagok 20 változóból áll, amelyek 1-től 20-ig terjedő indexekkel érhetők el. Gondolhatnánk azonban, hogy a tömbváltozóinkat 0-tól 19-ig számozzuk, ebben az esetben a tömböt a következőképpen kell deklarálni:
Dim Team_Members (0-től 19-ig) karakterláncként
Valójában alapértelmezés szerint a tömbelemek számozása 0-tól kezdődik, és a tömbdeklarációban előfordulhat, hogy a kezdeti index egyáltalán nincs megadva, így:
Dim Team_Members(19) As String
A VBA fordító egy ilyen bejegyzést 20 elemből álló tömb deklarálásaként kezel 0 és 19 közötti indexekkel.
Ugyanezek a szabályok érvényesek a többdimenziós Visual Basic tömbök deklarálásakor. Amint az egyik példában már látható, egy kétdimenziós tömb deklarálásakor a méret indexeit vessző választja el:
Halvány január_értékesítési_számok (1-től 31-ig, 1-től 5-ig) pénznemként
Ha azonban nem ad meg kezdőindexet a tömb mindkét dimenziójához, és így deklarálja:
Dim Jan_Sales_figures(31, 5) As Currency
akkor ezt a bejegyzést kétdimenziós tömbként kezeljük, amelynek első dimenziója 32 elemet tartalmaz 0 és 31 közötti indexekkel, a tömb második dimenziója pedig 6 elemet tartalmaz 0 és 5 közötti indexekkel.
Dinamikus tömbök
A fenti példákban szereplő összes tömbnek meghatározott számú dimenziója van. Sok esetben azonban nem tudjuk előre, hogy mekkora legyen a tömbünk. A helyzetből egy hatalmas tömb deklarálásával léphetünk ki, melynek mérete minden bizonnyal nagyobb lesz a feladatunkhoz szükségesnél. De egy ilyen megoldás sok extra memóriát igényel, és lelassíthatja a programot. Van jobb megoldás is. Használhatunk dinamikus tömböt – ez egy olyan tömb, amelynek mérete tetszőlegesen beállítható és megváltoztatható egy makró végrehajtása során.
A dinamikus tömb üres zárójelekkel van deklarálva, így:
Dim Team_Members() As String
Ezután deklarálnia kell a tömb dimenzióját a kód végrehajtása során a kifejezés használatával ReDim:
ReDim Team_Members (1-20)
És ha a kód végrehajtása során újra meg kell változtatnia a tömb méretét, akkor újra használhatja a ReDim kifejezést:
Ha a csapat_mérete > 20, akkor a Csapat_tagok újraszerkesztése (1-től csapatméretig) vége, ha
Ne feledje, hogy a dinamikus tömb ilyen módon történő átméretezése a tömbben tárolt összes érték elvesztését eredményezi. A már a tömbben lévő adatok tárolásához a kulcsszót kell használni megőrzéseaz alábbiak szerint:
Ha a Csapat_méret > 20, akkor Redimezze a Csapat_tagok megőrzése (1-től Csapatméretig) Vége, ha
Sajnos a kulcsszó megőrzése csak egy tömbdimenzió felső határának megváltoztatására használható. Egy tömb alsó határa ilyen módon nem változtatható meg. Továbbá, ha a tömbnek több dimenziója van, akkor használja a kulcsszót megőrzése, csak a tömb utolsó dimenziója méretezhető át.