Tömbök a Visual Basic alkalmazásban

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.

Hagy egy Válaszol