Ez az oktatóanyag bemutatja, hogyan kell deklarálni (Dim), létrehozni és inicializálni a tömbváltozókat a VBA -ban
Mi az a VBA tömbváltozó?
A VBA tömbváltozót úgy lehet felfogni, mint egy változócsoportot, ugyanazon a néven tárolva, és ugyanolyan adattípussal. Egy tömb szöveget, számokat vagy objektumokat tárolhat.
A tömb egy elemére hivatkozik az indexszám használatával.
A tömbváltozót ugyanúgy deklarálhatja, mint bármely más változót a Dim, Static, Public vagy Private kulcsszó használatával.
Statikus tömbök
Kétféle tömb létezik - statikus és dinamikus. A statikus tömb a tömb kezdeti deklarálásakor megadott mérettel van deklarálva. Ezt fix tömbnek is nevezik.
1 | Dim intA (4) egész szám |
A fenti tömböt a Dim utasítással deklaráljuk egy eljárás vagy modul szintjén, és a tömb mérete 5, mivel nem adtuk meg a tömb LBound értékét.
Nem, ez nem elírás! A tömb mérete 5, annak ellenére, hogy 4 -et adott meg a tömbben. Ennek oka, hogy a tömbindexek automatikusan nulláról indulnak.
Tömbindexek
A tömbindexek automatikusan nulláról indulnak, kivéve, ha Opcióalap 1 a kódmodul tetején található.
Ha Opcióalap 1 deklarálva van, akkor a tömbök automatikusan 1 -től indulnak.
A változók ilyen módon történő deklarálását azonban problémásnak tartom. A kódellenőrzők nem biztos, hogy tisztában vannak azzal, hogy a tömbök nulláról indulnak, vagy az Opcióbázis 1 deklarációból
Ehelyett inkább kifejezetten deklarálom a tömbök kezdő és véghelyzetét:
1 | Az intA -t (2–5) dimenzióként egészben |
Figyelje meg, hogy amikor ezt megteszi, a tömböt bármilyen számmal elindíthatja (nem csak 1 vagy 0).
Dinamikus tömbök
A Dynamic Array változó olyan tömb, amelynek mérete futás közben megváltoztatható. Dinamikus változókat deklarál méret nélkül.
1 | Dim intA () egész szám |
A ReDim utasítással megadhatja a tömb méretét a tömb létrehozása után.
1 | ReDim intA (2) |
A dinamikus tömb bármikor átméretezhető. A ReDim utasítás használata esetén azonban minden létező érték törlődik. A meglévő tömbértékek megőrzéséhez használja a ReDim Preserve helyette.
1 | ReDim Preserve intA (2) |
Dinamikus tömböt deklarálhat eljárás, modul vagy globális szinten, de csak egy eljárásban használhatja a ReDim utasítást.
Változatos tömbök
A variáns tömbök dinamikus tömbök, amelyekkel könnyebb dolgozni.
1 | Dim varNames () |
Vegye figyelembe, hogy nem kell megadnia az adattípust (feltételezzük, hogy variáns) vagy a tömb méretét.
Amint az alábbiakban látni fogjuk, inicializálhatja a tömbváltozatokat a tömbfunkció használatával (nem kell először tömböket átméretezni)!
Nyilvántartás modul és nyilvános tömbök
Amint fentebb látható, tömbök deklarálhatók az eljárásokon belül, az eljáráson belüli használatra:
1234 | Sub StaticArray ()'deklarálja a tömböt, amelynek LBound értéke 1 és UBound értéke 4Dim IntA (1–4) egész számkéntEnd Sub |
De deklarálhatók modul vagy globális szinten is.
1234567 | Explicit lehetőség'deklarálja a tömböt, amelynek LBound értéke 1 és UBound értéke 4Dim IntA (1–4) egész számkéntSub StaticArray ()End Sub |
Ebben a példában a tömbváltozó a kódmodulon belül bárhol meghívható. Ehelyett nyilvános tömböt deklarálhat, amely a VBA -projekt során használható (lásd a következő részt).
Nyilvános tömb deklarálása
Nyilvános statikus tömböt deklarál, mint nyilvános változót.
1 | Nyilvános strNames (3) karakterláncként |
Ennek a nyilatkozatnak a modul tetején kell lennie, az Option Explicit alatt. Ezt követően a VBA -projekt során bármilyen modulban vagy eljárásban felhasználható.
Ha a tömböt a modul tetején deklarálja, de a Dim kulcsszóval, akkor a tömb használata az adott modulra korlátozódik. Ha a tömböt külön modulban szeretné használni, az hibát eredményezne.
Inicializálja a tömböket
A statikus tömbhöz a következő módon rendelhet értékeket.
1234567891011 | Sub StaticArray ()'deklarálja a tömböt, amelynek LBound értéke 1 és UBound értéke 4Dim IntA (1–4) egész számként'inicializálja a tömbötIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'jelenítse meg a tömb 2. pozíciójának eredményét a közvetlen ablakbanHibakeresés. IntA nyomtatása (2)End Sub |
Ha futtatja a fenti eljárást, a 20 érték megjelenik a közvetlen ablakban.
Ugyanilyen módon hozzárendelheti az értékeket egy dinamikus tömbhöz is
12345678910111213 | Sub DynamicArray ()'deklarálja a dinamikus tömböt, de kihagyja a kötött értékeketDim IntA () mint egész'inicializálja a tömbötReDim IntA (1-4)IntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'jelenítse meg a tömb 2. pozíciójának eredményét a közvetlen ablakbanHibakeresés. NyomtatásIntA (2)End Sub |
Tömb funkció
Azonban, csak a variáns tömbvel, használhatja a tömb funkciót, amely könnyebb lehet, mint a standard módszer.
12 | 'töltse ki a tömbötintA () = tömb (10, 20, 30, 40) |
Töltse fel a tömböt hurokkal
A tömböket úgy is feltöltheti, hogy az Excel celláinak sorozata között ciklusokat hajt végre
1234567891011121314151617 | Sub TestDynamicArrayFromExcel ()'deklarálja a tömbötDim strNames () karakterláncként'deklaráljon egy egész számot, hogy megszámolja a tartomány soraitDim n Mint egész'deklarálja a ciklus egész számátDim i As Integer'számolja meg a tartomány soraitn = Tartomány ("A1", Tartomány ("A1"). Vége (xlDown)). Sorok. Szám'redimálja a tömböt a tartományban lévő sorok számára.ReDim strNames (n)I = 0 -tól n -igstrNames (i) = Tartomány ("A1"). Eltolás (i + 1, 0)Következő i'mutassa meg a tömb értékeitMsgBox csatlakozás (strNames ())End Sub |
Inicializálja újra a tömböket
A tömböt a kód bármely szakaszában újra inicializálhatja, de akkor elveszíti a tömb adott pozíciójában található eredeti értéket.
1234567891011121314 | Sub StaticArray ()'deklarálja a tömböt, amelynek LBound értéke 1 és UBound értéke 4Dim IntA (1–4) egész számként'inicializálja a tömbötIntA (1) = 10IntA (2) = 20IntA (3) = 30IntA (4) = 40'jelenítse meg a tömb 2. pozíciójának eredményét a közvetlen ablakbanHibakeresés. IntA nyomtatása (2)'inicializálja újra a tömbötintA (2) = 200Hibakeresés. IntA nyomtatása (2)End Sub |
A fenti példában a Statikus tömb megtartja az összes értéket, kivéve a 2. pozícióban lévő értéket - ez az érték 200 -ra változik.
A ReDim használata
Ha dinamikus tömböt használ, a ReDim utasítással állíthatja be a tömb méretét. A ReDim utasítással később a kódban módosíthatja a tömb méretét, ahányszor csak szükséges. Az alábbi kódsor újra inicializálja az intA tömböt 2 -es méretre (Ne feledje - a tömbindex 0 -tól kezdődik!)
1 | ReDim intA (1) egész számként |
Tehát a ReDim utasítást tartalmazó kód az alábbi példához hasonlít.
1234567891011121314151617 | Sub TestDynamicArray ()'deklarálja a tömbötDim intA () mint egészReDim intA (2)'töltse fel a tömböt számokkalintA (0) = 2intA (1) = 5intA (2) = 9'mutassa a számot az 1 -es pozícióbanHibakeresés. IntA nyomtatása (1)'módosítsa a tömböt a méret megváltoztatásáhozReDim intA (3)intA (0) = 6intA (1) = 8'ezúttal jelenítse meg a számot az 1. pozícióbanHibakeresés. IntA nyomtatása (1)End Sub |
Ha futtatja a fenti eljárást, az 5 -ös érték jelenik meg a közvetlen ablakban, majd a 8 -as érték jelenik meg, miután a ReDim segítségével átméreteztük a tömböt, és újra feltöltöttük. Mivel azonban nem töltettük ki az IntA-t (2), és nem használtuk a Re-Dim Preserve-t, a tömb adott pozíciójának értéke törlődik, és a tömb 3. és 4. pozíciója is nulla lesz.
A ReDim Preserve használata
Ha ReDim Preserve -t használunk, akkor megtartja a tömb eredeti értékeit.
1234567891011121314151617 | Sub TestDynamicArray ()'deklarálja a tömbötDim intA () mint egészReDim intA (2)'töltse fel a tömböt számokkalintA (0) = 2intA (1) = 5intA (2) = 9'mutassa a számot a 2 -es pozícióbanHibakeresés. IntA nyomtatása (2)'redimálja a tömbötReDim intA (3)intA (0) = 6intA (1) = 8'mutasd újra a számot a 2 -es pozícióbanHibakeresés. IntA nyomtatása (2)End Sub |
A fent látható mindkét üzenetmezőben a 9 -es szám jelenik meg, mivel a ReDim Preserve utasítás megtartotta ezt az értéket ebben a helyzetben.