Transcript VBA4ea

Pénzügyi feladatok
VBA támogatása
4. előadás
Barna Róbert
KE GTK
Informatika Tanszék
Tömbök
A tömb azonos típusú konstansok vagy változók rendezett
sorozata.
Az egydimenziós tömb elemei egy sorozatot alkotnak.
A kétdimenziós (2D) elemei táblázatban (sorokban és
oszlopokban) helyezkednek el.
A háromdimenziós (3D) tömböt úgy képzelhetjük el, mint
lapokból álló kartotékrendszert, amelyben minden lap egy
kétdimenziós táblázatot tartalmaz és a lapokat egymás
után soroljuk.
Pénzügyi feladatok VBA támogatása – 4. előadás
3 / 24
Tömbök
Háromnál több dimenziós tömböket meglehetősen nehéz
kezelni, mert csak részeikre bontva tudjuk elképzelni.
Ilyenekre inkább csak tudományos számításokban van
szükség, a hétköznapi életben nem.
A VBA legfeljebb 60 dimenziós tömbök létrehozását engedi
meg!
Pénzügyi feladatok VBA támogatása – 4. előadás
4 / 24
Tömbök deklarálása 1.
A változókra érvényes deklarálási szabályok szerint úgy,
hogy a változónév után kerek zárójelek között megadjuk az
index-határokat, majd As kulcsszóval az elemek (közös)
típusát.
Indexhatár számérték, számkonstans vagy ilyenekből
képzett aritmetikai kifejezés lehet; alsó_határ ≤ felső_határ
kötelező.
Az alsó határt nem kötelező megadni; ha nem szerepel, az
alapértelmezés szerinti, példáinkban 1 értékű lesz (később).
Ha nem adunk meg típusnevet, a tömb alapértelmezett
típusú lesz (Variant).
Pénzügyi feladatok VBA támogatása – 4. előadás
5 / 24
Tömbök deklarálása 1.
Egydimenziós tömb deklarálása:
Dim tömbnév ([alsóhatár To]felsőhatár) As típusnév
Dim összeg(0 to 9) As Long
Többdimenziós tömbök esetén - vesszővel elválasztva annyi indexhatár-párt, illetve indexhatárt kell felsorolni,
ahány dimenziós a tömb.
Pénzügyi feladatok VBA támogatása – 4. előadás
6 / 24
Tömbök deklarálása 2.
Indexhatárok megadása nélkül dinamikus tömbök hozhatók
létre.
Ilyenkor a konkrét indexhatárokat csak a rutin belsejében,
futás során lehet megadni, a tömbelemek feltöltése előtt,
Redim kulcsszóval.
Az egyszer megadott dimenziószám később már nem
változtatható meg, de az egyes dimenziók indexhatárait
többször is, tetszőlegesen újra lehet definiálni. Ilyenkor a
tömb aktuális tartalma általában elvész.
A Preserve kulcsszóval meg lehet őrizni a tömbértékeket,
de ekkor csak az utolsó dimenzió felső határát lehet
módosítani.
Pénzügyi feladatok VBA támogatása – 4. előadás
7 / 24
Tömbök deklarálása 3.
Variant típusú változókhoz az Array függvénnyel
rendelhetők - rögzített hosszúságú karakterláncok és saját
típusú változók kivételével - tetszőleges típusú, valamint
tetszőleges méretű és dimenziószámú tömbök.
A változó altípus-kódja ilyenkor a tömb típuskódja; például
Variant típusú tömb esetén 8204 (8192 + 12).
Pénzügyi feladatok VBA támogatása – 4. előadás
8 / 24
Tömbök
A tömbelemekre kerek zárójelbe írt indexeikkel hivatkozunk.
Minden tömbelemnek annyi indexe van, ahány dimenziós a
tömb.
Az egydimenziós tömbök elemeinek indexét sorszámnak,
a kétdimenziós tömbök elemeiét sor- és oszlopszámnak,
a háromdimenziósokéit lap-, sor- és oszlopszámnak
is nevezzük.
Pénzügyi feladatok VBA támogatása – 4. előadás
9 / 24
Tömbök
Az index számérték, számkonstans, numerikus változó,
vagy számot eredményező kifejezés lehet.
Az indexhatárok meghatározzák az indexek lehetséges
értékét, és természetesen az elemek darabszámát is.
Minden index értékének a megfelelő indexhatárok közé
kell esnie.
Pénzügyi feladatok VBA támogatása – 4. előadás
10 / 24
Tömbök
A tömbök helyfoglalása bájtban:
20 + 4*dimenziószám + elemszám*elemtípus.
Ha a tömböt Variant típusú változóba ültetjük, további
+12 bájtra van szükség.
Például egy egydimenziós 6 elemű logikai (Boolean)
tömb helyfoglalása 20 + 4*1 + 6*2 = 36 bájt;
ugyanez Variant típusú változóban 48 bájt.
Pénzügyi feladatok VBA támogatása – 4. előadás
11 / 24
Tömbök
Excel tömböket, azaz cellatartományokat csak Variant
típusú változókhoz rendelhetünk hozzá!
Az egy sorból, vagy egy oszlopból álló Excel tömbből
egydimenziós, az elemi tartományból kétdimenziós VBA
tömb lesz.
Fordított irányban nincs típuskorlátozás: bármilyen típusú
egydimenziós VBA tömbbel egy cellasort, kétdimenzióssal
téglalap alakú Excel tartományt tölthetünk fel.
Pénzügyi feladatok VBA támogatása – 4. előadás
12 / 24
Példa
Egydimenziós tömbök deklarálása 10 Long típusú elemből;
az indexhatárok 1÷10, 0÷9, illetve 100÷109:
Dim összeg(10) As Long
Dim összeg(0 to 9) As Long
Dim összeg(100 to 109) As Long
Pénzügyi feladatok VBA támogatása – 4. előadás
13 / 24
Példa
Egydimenziós, 7 Variant típusú elemből álló tömb;
indexhatárok 1÷7:
Dim tömb(7)
Lehetséges értékadások például:
tömb(l) = „alma”, tömb(2) = 3.14,
tömb(3) = True, …
Pénzügyi feladatok VBA támogatása – 4. előadás
14 / 24
Példa
Kétdimenziós tömb, amely 48 Boolean (logikai) típusú
elemből áll; indexhatárok 1÷4 és 11÷22:
Dim tmb(4, 11 To 22) As Boolean
Ehelyett:
Dim tmb(1 To 4, 11 To 22) As Boolean
Miért?
Például a 3. sor 5, eleme: tmb (3, 15).
Pénzügyi feladatok VBA támogatása – 4. előadás
15 / 24
Példa
Variant típusú változó, 7 elemű, String típusú tömbbel
feltöltve, miáltal indextartománya 0÷6 lesz:
Dim napok
napok = Array(”Hétfő”, ”Kedd”, ”Szerda”,
”Csütőrtök”, ”Péntek”, ”Szombat”, „Vasárnap”)
A napok(0) értéke „Hétfő”, a napok(6) értéke
„Vasárnap”.
Ha Variant típusú változóhoz az Array függvénnyel
rendelünk tömböt, az alsó indexhatár mindig 0 lesz, akkor
is, ha 1-re állítottuk az alapértelmezést!
Pénzügyi feladatok VBA támogatása – 4. előadás
16 / 24
Példa
Definiálunk egy egész típusú dinamikus tömböt, amelyet a
futás során először háromdimenziós 60 eleművé
deklarálunk át:
Static számok() As Integer
Redim számok(1 to 3, 2 to 6, 4)
Most a tömb első eleme számok (1,2,1), utolsó eleme
számok(3,6,4), a számok(1,1,1) elem nem létezik!
Pénzügyi feladatok VBA támogatása – 4. előadás
17 / 24
Példa
A következő deklarációban a határokat az x, y és z változó
aktuális értéke szabja meg, de a tömb addigi tartalma
elveszik:
Redim számok (x, y, z)
Harmadszor úgy változtatjuk meg a deklarációt, hogy
megőrizzük a tömbelemek értékét, ám ekkor csak az utolsó
dimenzió mérete változhat:
Redim Preserve számok(x, y, 12)
Pénzügyi feladatok VBA támogatása – 4. előadás
18 / 24
Feladat
A tömbök indexelésének gyakorlására a gimp_31.xls
munkafüzet tömbök munkalapján találunk egy zöld
szegéllyel keretezett táblázatot.
A táblázatnak csak az első 10 sora és 8 oszlopa tartalmaz
értékes adatot, de a kitöltöttekkel összefüggő cellákban
újabb adatok hozzáírásával bővíteni, vagy egész sorok,
illetve oszlopok törlésével szűkíteni lehet a tartományt.
A táblázatot a tömbök nevű makró-eljárás kezeli, amelyet a
CTRL+A billentyűkombinációval lehet elindítani.
Pénzügyi feladatok VBA támogatása – 4. előadás
19 / 24
Feladat
A makró a következőképpen működik:
Ha a „Sor” (B20) és az „Oszlop” (B21) cellába beírunk egy
sor- és egy oszlopszámot, a megfelelő táblázatelem
kiemelt színű lesz, és értéke egyidejűleg bekerül az „Érték”
(E20) cellába.
A sor és az oszlopszám természetesen nem haladhatja
meg a kitöltött tartomány megfelelő méretét; ellenkező
esetben az „Érték” cellában hibajelzést kapunk.
Ugyancsak hibajelzéshez vezet, ha a kijelölt cella nem a
kitöltött tartományban van.
Pénzügyi feladatok VBA támogatása – 4. előadás
20 / 24
Feladat
A makró a következőképpen működik:
Ha a makró indításakor mind a sor-, mind az oszlopcella
üres, az eljárás színezéssel kiemeli a táblázatban kijelölt
cellát, és ennek értékét Írja az értékcellába.
Pénzügyi feladatok VBA támogatása – 4. előadás
21 / 24
Feladat
A makró a következőképpen működik:
Az eljárásban a méretellenőrzéshez a CurrentRegion
tulajdonságot használjuk, amely visszaadja azt a
tartomány-objektumot, amelyben az aktív cella van.
Ennek méreteit úgy határozza meg, hogy az aktív cellából
indulva minden irányban kiterjeszti a kijelölést az első üres
sorig és oszlopig, illetve a munkalap határáig.
Egy kijelölt objektum - ebben az esetben a kijelölt
tartomány - sorait a Rows, oszlopait a Columns
konténerből lehet kiválasztani, számukat a Count
tulajdonság adja meg.
Pénzügyi feladatok VBA támogatása – 4. előadás
22 / 24
Feladat
Jövőbeni felhasználása során ügyeljünk rá, hogy a
CurrentRegion tulajdonság az aktív cella sorát és
oszlopát mindenképpen figyelembe veszi.
Következésképpen akkor is 1 értéket ad a sor- és az
oszlopszámra, ha a kijelölt tartomány minden cellája, illetve
az aktív cella minden szomszédja üres!
Ha ez a gyanú felmerül, előzetesen meg kell vizsgálni a
helyzetet az IsEmpty függvénnyel.
Pénzügyi feladatok VBA támogatása – 4. előadás
23 / 24
Köszönöm a figyelmet!
Folyt köv.
Pénzügyi feladatok VBA támogatása – 4. előadás
24 / 24