KURZUS: Számítási módszerek

MODUL: Excel programozás

2. lecke: Adattípusok, adatok kezelése

Cél: Ebben a leckében a VB egyszerű adattípusaival és az adatok kezelésével fogunk foglalkozni. Igazi programot még nem fogunk készíteni, de olyan építőelemeket ismerünk meg, amelyek használata elengedhetetlen lesz a későbbiekben. Lesznek olyan részek, amelyek ismerősek lehetnek az Informatikai rendszerek alapjai (Informatika I.) tárgynál tanultakból (pl. logikai műveletek), de javasoljuk, hogy ezeket is tanulmányozza át.

Követelmények: Ön akkor sajátította el megfelelően a tananyagot, ha képes

  • meghatározni, hogy milyen adattípust érdemes (vagy kell) használni az egyes feladatokhoz,
  • változókat deklarálni és azoknak értéket adni,
  • használni a leckében bemutatott függvényeket,
  • kifejezéseket készíteni és kiértékelni a VBA precedencia szabályainak megfelelően,
  • bekérni és kiírni adatokat.

Időszükséglet: A tananyag elsajátításához (a feladatok megoldásával együtt) hozzávetőlegesen 6 órára lesz szüksége.

Kulcsfogalmak

  • Egész adattípus
    • Byte
    • Integer
    • Long
  • Valós adattípus
    • Single
    • Double
  • Logikai adattípus
    • Boolean
  • Változó
  • Dim utasítás
  • InputBox
  • MsgBox
Egyszerű adattípusok

Minden programozási nyelv (így a VB is) meghatározza az adatok azon körét, amelyet kezelni tud. Azt, hogy milyen fajta adatokat használhatunk, ezekkel milyen műveleteket végezhetünk, ezek hogyan tárolódnak, az adattípusok definiálják. Attól függően, hogy az adattípus egy vagy több logikailag összetartozó adat használatát engedi meg, megkülönböztetünk egyszerű és összetett adattípusokat. Az egyszerű adattípusokról ebben a leckében, az összetett adattípusokról a 4. leckében lesz szó.

Egész adattípusok

Az egész számok használatát többféle egész típus biztosítja, amelyek az adatok tárolására felhasznált memóriaterület méretében, az előjel kezelésében, így az egyes típusokhoz tartozó egész számok tartományában különböznek.

Az egész adattípusok
AdattípusTárolási méretTartomány
Byte1 bájt0 .. 255
Integer2 bájt-32768 .. 32767
Long4 bájt-2147483648 .. 2147483647

1. táblázat

Míg a Byte típus 1 bájtja csupán 28 = 256 db, addig a Long típus 4 bájtja már 232 (kb. 4 milliárd) különböző érték (egész szám) tárolását biztosítja.

Az egész típusú adatokkal a matematikában szokásos műveletek végezhetők el, amelyet a 2. és 3. táblázatok szemléltetnek. Az aritmetikai műveletek táblázatbeli sorrendje a műveletek erősorrendjét (prioritás, precedencia) tükrözi, ahol legelöl a legerősebb (legmagasabb prioritású) hatványozás található.

A hasonlítások között nincs erősorrendbeli különbség (azonos prioritásúak), de prioritásuk gyengébb, mint az aritmetikai műveleteké. A hasonlítási műveletek nemcsak egész számokra, de más adatokra (pl. valós számok, sztringek stb.) is értelmezettek, eredményük logikai típusú. A logikai adattípusról és a kifejezések kiértékelésének szabályairól későbbi fejezetekben lesz szó.

Az egész adattípusok aritmetikai műveletei
Aritmetikai műveletek
Hatványozás (^)
Negáció (-)
Szorzás (*), osztás (/)
Egész osztás hányadosa (\)
Egész osztás maradéka (Mod)
Összeadás (+), kivonás (-)

2. táblázat

A hasonlítási műveletek
Hasonlítások
Egyenlő (=)
Nem egyenlő (<>)
Kisebb (<)
Nagyobb (>)
Kisebb vagy egyenlő (<=)
Nagyobb vagy egyenlő (>=)

3. táblázat

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! Az eredmények kiírásához használja a kiíró utasítást (print, ?)! (A jobbra nyilak után a kifejezések eredményét is feltüntettük, de ezek természetesen nem a kifejezések részei, mint ahogyan a nyilak sem.)

-3^2  -9
3/2 1.5
5\3 1
5 Mod 3 = 2  True

Megjegyzés

  • A kisebb vagy egyenlő (<=), illetve a nagyobb vagy egyenlő (>=) műveletek (ahogyan azt a nevük is sugallja) csak akkor igazak, ha a kisebb (<) vagy egyenlő (=), illetve a nagyobb (>) vagy egyenlő (=) műveletek legalább egyike igaz.
  • A műveleteket operátoroknak, a műveletekben résztvevő adatokat operandusoknak, a hasonlításokat pedig relációs műveleteknek (vagy egyszerűen csak relációknak) is nevezik.
  • Egyes Excel-változatoknál a hatványozás csak akkor működik helyesen, ha az operátor előtt és után szóköz áll.
Valós adattípusok

A valós számok esetén kétféle típust használhatunk, amelyek jellemzőit a 4. táblázat szemlélteti. Noha a használható számok nagyságrendje kb. 1038, a tárolásra használt 4, illetve 8 bájt csak kb. 7-8, illetve 15-16 értékes (decimális) számjegyet biztosít (a többi számjegy a kerekítés miatt 0 lesz).

A valós adattípusok
AdattípusTárolási méretÉrtékes jegyek
Single4 bájt7-8
Double8 bájt15-16

4. táblázat

A valós adattípusok műveletei az egész osztás (\, Mod) műveletek kivételével megegyeznek az egész adattípusok műveleteivel.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

4^-0.5   0.5
11111222223333344444*2  2,22224444466667E+19
Logikai adattípus

A logikai (Boolean) adattípusban kétféle érték létezik, az igaz (True) és a hamis (False). A három legfontosabb logikai művelet a tagadás (Not), az és (And), és a vagy (Or), amelyek igazságtáblázatát az 5. táblázat szemlélteti. A logikai értékekre értelmezettek a hasonlítás műveletek (lásd 3. táblázat) is.

Logikai műveletek
ABNot AA And BA Or B
TrueTrueFalseTrueTrue
TrueFalseFalseFalseTrue
FalseTrueTrueFalseTrue
FalseFalseTrueFalseFalse

5. táblázat

A tagadás egyoperandusú művelet az ellenkezőjére változtatja a logikai értéket (igazból hamis lesz és fordítva), az és kétoperandusú művelettel összekapcsolt logikai kifejezés csak akkor lesz igaz, ha mindkét operandus igaz, míg a vagy kétoperandusú művelettel összekapcsolt logikai kifejezés csak akkor lesz hamis, ha mindkét operandus hamis.

Megjegyzés

  • Logikai művelet még a kizáró vagy (Xor), az ekvivalencia (Eqv) és az implikáció (Imp) is.
  • A logikai értékek között is értelmezett a sorrendiség (bár ezt ritkán használjuk), nevezetesen a False érték megelőzi a True értéket, azaz False < TrueTrue, így a logikai értékekre definiált az összes hasonlítási művelet.
Szöveges adattípus

A szöveges (String) adattípus szöveges adatok (karaktersorozatok) használatát biztosítja. A String kulcsszó változó hosszú sztringeket deklarál, amelyek a maximális adathosszig (231 darab karakter) tetszőleges hosszúak lehetnek. A sztringeket macskakörmök közé kell tenni. Az üres sztringnek ("") nincs egyetlen karaktere sem.

A sztringekre az összefűzés művelet (más néven konkatenáció) (+, &) és a hasonlítások (lásd 3. táblázat) értelmezettek. A + művelet csak szövegeket fűz össze, az & számokat is képes összefűzni, amelyeket a művelet elvégzése előtt sztringgé alakít (konvertál).

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

"alma" + "fa"   "almafa"
3 & 3 * 5  "315"

A hasonlítási műveletek kiértékelése a sztringek karakterei alapján történik. Két sztring egyenlő (=), ha egyforma hosszúak és karaktereik rendre megegyeznek, egyébként nem egyenlők (<>). A kisebb (<), illetve nagyobb (>) hasonlítási műveleteknél a sztringek első különböző karakterpárja határozza meg az eredményt (lásd megjegyzés). Ha nincs ilyen karakter (az egyik sztring kezdőszelete a másiknak), akkor a rövidebb sztring lesz a kisebb.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

"Alma" < "alma"   True
"Kovács" < "Kovácsné"  True
"Kovacs" < "Kovács"  True

Megjegyzés

  • A sztringek összehasonlítására az Option Compare (modulszintű) utasítás is hatással van.
    Az Option Compare Binary (alapértelmezett) esetben a karakterek (Windows kódlapbeli) kódjai alapján történik a hasonlítás.

    Az Option Compare Text utasítás olyan összehasonlítást eredményez, amely nem különbözteti meg a kis- és nagybetűket (case insensitive).

  • Lehetőség van fix hosszú sztringek használatára is. Ekkor a String kulcsszó után (egy csillag karakterrel elválasztva) megadandó a sztringek hossza is (pl. String * 30). Egy ilyen típusú változóban tárolt sztring hossza fixen a típusban rögzített hossz lesz (a példában 30), a hosszabb sztringek jobbról csonkulnak, a rövidebbek pedig szóközökkel egészülnek ki. (A változókról hamarosan szó lesz, a fix hosszú sztringek használatáról egy példát a 4. leckében láthatunk.) A maximális adathossz 216 darab karakter.
  • A sztringek minta alapján történő hasonlítására a Like művelet használható.
  • Az & operátor elé és mögé tegyünk szóközt!
Egyéb adattípusok

A dátum/idő (Date) adattípus segítségével dátum és/vagy időadatokat tudunk kezelni. Egy (8 bájton tárolt) valós szám egész része a dátum, tört része pedig az időpont megadására használatos. Az időkezelés megegyezik az Excel időkezelésével, a dátumkezelés kicsit eltérő. Az Excel csak pozitív számokat tud dátumként értelmezni, a VB negatív számokat is kezel, amellyel a dátum 100.01.01-től 9999.12.31-ig terjedő érték lehet.

Pl. Excel: 1.25 ~ 1900.01.01 6:00:00, VB: 1.25 ~ 1899.12.31 6:00:00, -1.5 ~ 1899.12.29 12:00:00

A Currency adattípus a pénzügyi számításokhoz ajánlott. Egy ilyen típusú adat fixen négy tizedes jegyet tartalmaz, mert az adat tízezerszerese tárolódik egész számként (8 bájton, ami 19-20 értékes decimális jegy pontosságot jelent).

A Variant adattípust akkor használjuk, ha egy adatnak nem tudjuk előre a típusát, vagy egy változóban (lásd a következő fejezet után) különböző típusú adatokat (pl. szám, szöveg) szeretnénk tárolni. A kényelmes használat ára a nagyobb memóriaterület (szám esetén 16 bájt, szöveg esetén 22 + a szöveg karaktereinek számával megegyező bájt).

Megjegyzés: A Variant típusú változók speciális értékeket (Empty, Error, Nothing, Null) is tartalmazhatnak.

A VBA előszeretettel használja a felsorolt (Enum) típust akkor, amikor az adatoknak csak néhány lehetséges értéke van. Az Enum típusú adatok mindegyikéhez egy azonosító és egy egész szám rendelhető. A forrásprogramokban ugyan mindkettő használható, de célszerű az azonosítók használata, így a forráskód kifejezőbb, érthetőbb lesz.

Adatok kezelése

Ahhoz, hogy adatainkat a számítógép kezelni tudja, tárolnia is kell. A tárolás mikéntje, konkrét megvalósítása egyrészt az adatok típusától, másrészt az alkalmazott fejlesztőkörnyezettől és az operációs rendszertől is függ.

Adatainkat alapvetően a számítógép memóriájában tároljuk, de szükség esetén külső adathordozón (adatfájlokban) is eltárolhatjuk. A fájlokban történő adattárolásra akkor van szükség, ha adatainkat két programfutás között is meg szeretnénk őrizni. A memóriában történő adattárolásról most, az Excel-fájlokban (munkafüzetekben) történő adattárolásról az 5. leckében lesz szó.

Változó

Változón olyan azonosítóval ellátott memóriaterületet értünk, ahol a változó típusának megfelelő értéket (pl. adatot, részeredményt) tárolhatunk. Egy változóban tárolt érték a program végrehajtása során megváltozhat - innen ered az elnevezése -, ilyenkor a változóba kerülő új érték felülírja a régit.

A változók használatát általában megelőzi azok deklarálása, amikor is megadjuk a változó típusát. A legtöbb programozási nyelvben (pl. C, Pascal) kötelező a változók deklarálása, de a Visual Basic megengedi a változók deklaráció nélküli használatát is. A deklarálatlan változók típusa Variant lesz.

Mindazonáltal a deklarálatlan változók (a "kényelmes" használat mellett) lehetséges hibaforrások is egyben (pl. egy változó azonosítójának elgépeléséből adódó hiba csak futásidőben derül ki), ezért a VB külön utasítást biztosít arra, hogy a változókat deklarálni kelljen. Az Option Explicit (modulszintű) utasítás kikényszeríti a változók deklarálását azáltal, hogy szintaktikai (formai) hibát kapunk egy nem deklarált változó használatakor.

A változók deklarálásának (egyszerűsített) szintaktikája:

Dim varname [As type] [,...]
varnameA változó (betűvel kezdődő) azonosítója (neve).
typeA változó típusa (ha hiányzik, a változó Variant típusú lesz).

Pl.

Dim i As Integer   'Egy Integer típusú változó deklarálása
Dim v              'Egy Variant típusú változó
Dim a,b As Single  'Egy Variant és egy Single típusú változó

Ismételje át az Immediate ablakról tanultakat! (A Dim utasítás nem próbálható ki az Immediate ablakban.)

Megjegyzés

  • A példában szereplő sorok végén magyarázó megjegyzések találhatók, amelyeket a Visual Basic Editor a kódszerkesztő ablakban alapértelmezetten zöld színnel emel ki.
  • Egy változó azonosítójának (mint minden más programbeli azonosítónak) be kell tartaniuk a VB névmegadási szabályait (naming rules). Ezek többek között előírják, hogy betűvel kell kezdődnie, nem haladhatja meg a 255 karaktert, nem tartalmazhat speciális karaktereket (pl. ., !, @, &, $, #) stb. Célszerű olyan beszédes (azaz a változó szerepére, a benne tárolt adatra/adatokra utaló), rövid, alfanumerikus karaktersorozatot használni, amelyeknek nincs más jelentésük a VB-ben.
  • Az azonosítókban magyar ékezetes betű és az alulvonás karakter (_) is használható (pl. Év_Hó_Nap), de a kis és nagybetűk között nincs különbség. Egy változó azonosítója a deklaráláskor megadott formában jelenik meg hivatkozáskor (pl. ha i-t deklaráltunk, akkor az I-vel való hivatkozás i-re cserélődik a kódszerkesztő ablakban).
  • Noha a változóknak a VB ad kezdőértéket (a numerikus változók 0, a logikai változók False, míg a String és Variant típusú változók üres sztring kezdőértéket kapnak), lehetőleg csak olyan változók értékeit használjuk fel, amelyeknek korábban már definiáltuk az értékét!
  • Egy nem deklarált változó típusa ún. típusdeklarációs karakterrel is megadható. A használható karakterek és a hozzájuk tartozó adattípusok:
    % Integer, ! Single, # Double, $ String, @ Currency (pl. a v! változó Single típusú lesz)

Az előzőek ismeretében próbálja ki (újra) az 1. lecke végén szereplő, egyetlen utasítást (MsgBox "Helló!") tartalmazó szubrutint macskakörmök nélkül (illetve felkiáltójel nélkül), azaz amikor a kiírandó adat (véletlenül) nem egy szöveg (sztringkonstans), hanem egy deklarálatlan (Variant vagy Single típusú) változó (aminek a VB adott kezdőértéket)!

Kifejezés

Kifejezésen olyan számítási műveletsort értünk, amellyel megmondjuk, hogy milyen adatokkal, milyen műveleteket, milyen sorrendben kívánunk elvégezni. A kifejezés kiértékelésekor egy új érték - a kifejezés értéke - keletkezik.

A kifejezésben szerepelhetnek:

  • Konstansok, változók, függvényhívások
  • Műveletek
  • Zárójelek

Pl. (-b+Sqr(b*b-4*a*c))/(2*a)

A példában a 4 és 2 konstansok, az a, b, c változók, az Sqr a négyzetgyök függvény.

Keresse meg a VBA súgójában a műveletek erősorrendjére (operator precedence) vonatkozó súgóoldalt!

A műveletek prioritása csökkenő erősorrendben:

  • Aritmetikai
    • Hatványozás (^)
    • Negáció (-)
    • Szorzás, osztás (*, /)
    • Egész osztás hányadosa, maradéka (\, Mod)
    • Összeadás, kivonás (+, -)
  • Szöveg összefűzés (&, +)
  • Hasonlítások (=, <>, <, >, <=, >=, Like, Is)
  • Logikai (Not, And, Or, Xor, Eqv, Imp)

Az egyes hasonlítások azonos prioritásúak, az egész osztás műveleteit és a logikai műveleteket csökkenő prioritás szerinti sorrendben adtuk meg.

A kifejezések kiértékelésének szabályai:

  • A zárójelbe tett kifejezések és függvényhívások operandus szintre emelkednek.
  • A magasabb prioritású műveletek végrehajtása megelőzi az alacsonyabb prioritású műveletek végrehajtását.
  • Az azonos prioritású műveleteknél a balról-jobbra szabály érvényes, ami azt jelenti, hogy ezen műveletek végrehajtása balról jobbra haladva történik.

Megjegyzés

  • Ha szükséges, akkor a típuskonverziók automatikusan végrehajtódnak.
  • Az Is művelettel objektumhivatkozások egyezése vizsgálható.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

3 * 4 <= 12 And "a" & 12 = "a12"   True
3.8 \ 2 * 3  0
(3.8 \ 2) * 3  6

Az első példában a szorzás, majd az összefűzés (a 12 szöveggé konvertálásával), utána a hasonlítások, végül az And művelet hajtódik végre, amivel True értéket kapunk. A második és harmadik példában szereplő 3.8 valós szám egy egész osztásban szerepel, ezért értéke egészre konvertálódik (4-re kerekítődik). A második példában először a szorzás (eredménye 6), majd az egész osztás (4\6) hajtódik végre, így az eredmény 0 lesz. A harmadik példa zárójelezése megváltoztatja a prioritásból adódó sorrendet, így először az egész osztás (4\2) hajtódik végre, majd a szorzás, így az eredmény 6 lesz.

Függvények

A programozási nyelvek beépített függvényekkel segítik a számolást, adatfeldolgozást. Ezeket csak használnunk kell, azaz a megfelelő paraméterekkel meg kell hívnunk őket. Az alábbiakban (csoportokba foglalva) felsorolunk néhány gyakran használatos függvényt (de hangsúlyozzuk, hogy ez a felsorolás korántsem teljes, a VB-ben sokkal több függvényt használhatunk).

Matematikai függvények
Abs(X)X abszolút értéke.
Exp(X)Az exponenciális függvény (ex) értéke az X helyen.
Log(X)A természetes alapú logaritmus függvény értéke az X helyen.
Sin(X)X szinusza (X radiánban adott).
Cos(X)X koszinusza (X radiánban adott).
Sqr(X)X négyzetgyöke.
Int(X)A legnagyobb egész szám, amely még nem nagyobb, mint X.
Rnd()Egy véletlen szám a [0, 1) intervallumból.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! Az eredmények kiírásához használja a kiíró utasítást (print, ?)!

Int(3.8)   3
Int(-3.8)  -4

Egy véletlen egész szám az [a,b] intervallumból: Int((b-a+1)*Rnd)+a

Megjegyzés: A paraméterek nélküli függvényeknél az üres zárójelpár elhagyható (mint a példában az Rnd esetén).

Konverziós függvények
Asc(X)Az X karakter ASCII kódja.
Chr(X)Az X ASCII kódú karakter.
Str(X)Az X numerikus adat szövegként.
Val(X)Az X számot tartalmazó szöveg numerikus értéke.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

Asc("A")   65
Chr(65)  "A"
Str(2.3)  " 2.3"
Val("2.3")  2.3
Adott típusú értékké konvertáló függvények
CStr(X)X értékét String értékké.
CInt(X)X értékét Integer értékké.
CSng(X)X értékét Single értékké.
CDate(X)Az X érvényes dátumkifejezést Date értékké.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

CStr(2.6)   "2,6"
CInt(2.6)  3
CSng("2,6")  2.6

Megjegyzés

  • Ezekből a konvertáló függvényekből csak néhányat ragadtunk ki, de minden egyszerű adattípushoz létezik ilyen függvény.
  • A kékkel kiemelt függvénynevek (csakúgy, mint a többi, kék színnel kiemelt szó) kulcsszavak, nem használhatók másra (pl. egy változó azonosítójának).
  • Az átalakítandó X érték tetszőleges típusú érték lehet (pl. szám, szöveg, logikai érték).
  • A CStr függvény az operációs rendszerbeli tizedesjelet használja (a példa azt az esetet szemlélteti, amikor a beállított tizedesjel a vessző).
  • Ha számot tartalmazó szöveges adatot konvertálunk numerikus adattá, akkor tizedesjelként a vessző és az operációs rendszerben beállított tizedesjel használható. Ha pl. vessző az operációs rendszerben beállított tizedesjel, akkor a pont használata esetén típuskeveredési hibát kapunk (pl. CInt("2.6")).
  • Ha az X érték nem konvertálható az eredménytípus értékkészletébe, akkor hibát kapunk (pl. CByte(-1)).
Szövegkezelő függvények
Len(X)Az X sztring hossza (karaktereinek száma).
Left(X,Y)Az X sztring elejéről Y darab karakter.
Right(X,Y)Az X sztring végéről Y darab karakter.
Mid(X,Y[,Z])Az X sztring Y-adik karakterétől Z darab karakter.
Trim(X)Az X sztring vezető és záró szóközeinek levágása.
InStr([X,]Y,Z)A Z sztring megkeresése az Y sztringben (az X-edik karaktertől kezdődően).

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

Len("Alma")   4
Left("Alma",2)  "Al"
Right("Alma",2)  "ma"
Mid("Alma",3,1)  "m"
Mid("Alma",3)  "ma"
Trim(" a b ")  "a b"
InStr("alma","a")  l
InStr(2,"alma","a")  4
InStr("alma","A")  0

Megjegyzés

  • Vezető szóközök levágása: LTrim, záró szóközök levágása: RTrim.
  • Ha a Mid függvény Z paraméterét nem adjuk meg, vagy megadjuk, de nincs annyi darab karakter az Y-adik karaktertől kezdődően, akkor az eredmény az X sztring utolsó karakteréig tart.
  • Az InStr függvény X paramétere elhagyható, ekkor a keresés az Y sztring első karakterétől indul. Ha a keresett Z szöveg nem található meg az Y szövegben (az X-edik karaktertől kezdődően), akkor 0 eredményt kapunk, egyébként meg a találat kezdőpozícióját.
  • Létezik Mid utasítás is, amellyel egy sztring karakterei más karakterekre cserélhetők.
Dátum- és időkezelő függvények
DateAz aktuális (operációs rendszerbeli) dátum.
TimeAz aktuális (operációs rendszerbeli) idő.

Megjegyzés: A dátumok hasonlóan kezelhetők, mint az Excel-ben (pl. a Date-1 kifejezés a tegnapi dátumot adja).

Adatformázó függvény
Format(X[,Y])Az X kifejezés sztringgé alakítása az Y formázó sztring alapján.

Próbálja ki a következő kifejezések kiértékelését az Immediate ablakban! (Az eredmények kiírásához használja a kiíró utasítást (print, ?)!)

Format(100/3,"0.00")   "33,33"
Format(CDate("89.12.05"), "Long Date")  "1989. december 5."
Az értékadó utasítás

Az értékadó utasítással egy változónak adhatunk értéket. Az utasítás szintaktikája:

[Let] varname = expression
varnameA változó azonosítója.
expressionA tárolandó értéket meghatározó kifejezés.

Az utasítás végrehajtásakor először kiértékelődik az értékadás jobb oldalán álló kifejezés (expression), azaz kiszámítódik a kifejezés értéke, majd ha a kapott érték tárolható az adott változóban (varname), akkor megtörténik a tárolás, különben futási (run-time) hiba lép fel.

Megjegyzés

  • Az utasítás kulcsszava (Let) elhagyható, ezért többnyire el is hagyjuk.
  • A számolás közben, illetve a tárolás előtt a VB implicit (általunk nem definiált) típuskonverziókat hajthat végre (lásd az alábbi példákat). A megfelelő konverziós függvények használatával azonban explicit (általunk megadott) módon szabályozhatjuk a szükséges típuskonverziókat, így elkerülhetjük az implicit típuskonverziókat és az esetlegesen ebből eredő programhibákat.

Gondolja át a következő utasításokat!

Dim i As Byte        'Az i változó deklarálása
i = 255              'A legnagyobb Byte érték
i = i + 1            'Túlcsordulási hiba (Overflow)!
v = "szöveg"        'Variant típusú változóba szöveget
v = 3.14            'Variant típusú változóba számot
i = "a"              'Típuskeveredési hiba (Type mismatch)
i = "2" + "2"        'Az i változóba 22 kerül
i = "2" + "2" * "2"  'Az i változóba 6 kerül

A példában egy Byte típusúra deklarált i és egy deklarálatlan (ezért Variant típusú) v változónak adunk különböző értékeket.

Az első értékadás a legnagyobb Byte típusú adatot teszi az i változóba. Ezzel nincs semmi baj, de ekkor a második értékadás túlcsordulási (overflow) futási hibát eredményez, hiszen a kifejezés értéke 256 lesz, ami már nem tárolható az i változóban. Ha az i változó aktuális értéke (tartalma) nem 255, akkor az utasítás rendben végrehajtódik, azaz az i változóban eggyel nagyobb szám lesz, mint az értékadás előtt.

A harmadik és negyedik értékadás azt szemlélteti, hogy egy Variant típusú változóba különböző típusú adatokat is tehetünk.

Az ötödik értékadás egy típuskeveredési (type mismatch) futási hibát ad, hiszen egy (számmá nem alakítható) szöveget szeretnénk tárolni egy numerikus változóban.

Az utolsó két értékadás az automatikus típuskonverziót szemlélteti. Az egyik értékadás kifejezésének eredménye 22, hiszen két db sztringet fűzünk össze, de az i változóba ennek a sztringnek az egész számmá alakított értéke kerül. A másik értékadásban a szorzás művelet hajtódik végre először (a nagyobb prioritás miatt), ezért a szorzás operandusai számmá konvertálódnak, majd összeszorzódnak (4). Mivel a + művelet egyik operandusa numerikus, ezért ez a művelet az összeadás művelet lesz (és nem a sztringek összefűzése), ami szintén numerikussá alakítja a bal oldali operandusát ("2"). Eredményül tehát a 6 érték számolódik ki és tárolódik az i változóban.

Adatok bekérése

Egy változónak nemcsak az előbb ismertetett értékadó utasítással adhatunk értéket. Lehetőség van a változók értékeinek a program futása (végrehajtása) során történő megadására is. Például egy másodfokú egyenletet megoldó program esetén célszerű az egyenletet meghatározó együtthatókat bekérni, ahelyett, hogy azok konkrét értékeit a programba beírnánk, hiszen a bekérő utasítás használatával a program módosítása nélkül tudunk különböző másodfokú egyenleteket megoldani. Elegendő csak újra futtatnunk a megoldó programot és más bemenő adatokat adni.

Az alábbi VB függvény egy párbeszédablak segítségével egy szöveges adat bekérését, megadását biztosítja. Az utasítás (egyszerűsített) szintaktikája:

InputBox(prompt[,title][,default])
promptTájékoztató üzenet.
titleAz ablak fejlécében megjelenő szöveg.
defaultAz adat alapértelmezett értéke.

Pl.

Dim n As Integer
n = InputBox("Kérem az adatok számát!")

A példa egy egész szám bekérését szemlélteti, ahol csak a kötelező (prompt) paramétert adtuk meg. A bekért szöveges adatot egy numerikus változóba (n) tesszük (implicit típuskonverzióval), ezért rossz adat (pl. nem számmá alakítható szöveg) megadása esetén hibaüzenetet kapunk.

A függvény végrehajtásakor egy párbeszédablak jelenik meg (lásd következő ábra). Az adatot a beviteli mezőben kell megadni. A függvény eredménye az OK gomb megnyomása (vagy az Enter billentyű leütése) esetén a megadott szöveg lesz, egyébként pedig (Cancel gomb, Esc billentyű, ablak bezárás) az üres sztring.

A példában szereplő InputBox függvény párbeszédablaka
1. ábra

Megjegyzés

  • A függvénynek egyéb opcionális paraméterei is vannak.
  • Valós számok bekérése esetén ügyeljünk arra, hogy az implicit típuskonverzió tizedesjelként csak a vesszőt és az operációs rendszerben beállított tizedesjelet fogadja el. Ha pl. vessző az operációs rendszerben beállított tizedesjel, akkor a pont használata esetén típuskeveredési hibát kapunk.

Próbálja ki az alábbi két utasítás egymás utáni végrehajtását az Immediate ablakban!

név = InputBox("Kérem adja meg a nevét!")
print név
Adatok kiírása

Többnyire még a legegyszerűbb programoknak is vannak bemenő (input) és eredmény (output) adatai. A bemenő adatok egyik megadási lehetőségét az előzőekben ismertettük, az eredmények megjelenítési lehetőségeiről most lesz szó.

Az alábbi VB függvény egy párbeszédablak segítségével egy szöveges adatot jelenít meg. Az utasítás (egyszerűsített) szintaktikája:

MsgBox(prompt[,buttons][,title])
promptA kiírandó adat.
buttonsAz ablak nyomógombjait definiáló érték.
titleAz ablak fejlécében megjelenő szöveg.

Próbálja ki az alábbi példák végrehajtását az Immediate ablakban!

MsgBox("2*3=" & 2*3)
MsgBox "2*3=" & 2*3
MsgBox 3^2,,"Három négyzete"

Az első két esetben a kiírandó adatot két adat (egy szöveg és egy szám) összefűzésével állítottuk elő, a harmadik esetben nem adtuk meg a buttons paramétert. A megfelelő párbeszédablakok a következő ábrán láthatók (az első két MsgBox hívás ugyanazt eredményezi).

A példákban szereplő MsgBox függvények párbeszédablakai
2. ábra

Megjegyzés

  • A kiírandó adat tetszőleges típusú kifejezéssel megadható, ekkor a kifejezés értéke (implicit típuskonverzióval) sztringgé konvertálódik. Valós számok tizedesjele az operációs rendszerben beállított tizedesjel lesz.
  • Ha a buttons paramétert elhagyjuk, akkor csak az OK gomb jelenik meg. A paraméterrel nemcsak a megjelenő nyomógombok, de a párbeszédablak egyéb tulajdonságai is definiálhatók.
  • A függvénynek egyéb opcionális paraméterei is vannak.
  • Noha a MsgBox függvény, a függvény visszatérési értékét csak akkor használjuk, ha be kell azonosítani, hogy melyik gombbal zárják be az ablakot.
  • A példában szereplő MsgBox függvényt eljárásként hívtuk meg. A szubrutinokról és azok hívási szabályairól (pl. zárójel kirakás/elhagyás) később lesz szó.

Ha sok adatot kell megjelenítenünk, akkor az egyenkénti megjelenítés esetén minden adat után be kell zárnunk a megjelenő párbeszédablakot. Alkalmazva az előző példában szereplő gondolatot, célszerű az összes megjelenítendő adatot egy sztringgé összefűzni, így elegendő egyetlen MsgBox hívás az adatok megjelenítésére. Ennél a megoldásnál az adatokat a Chr(13) (carriage return), illetve Chr(10) (linefeed) karakterek segítségével (vagy a megfelelő VB konstansokkal, pl. vbCrLf) többsoros szöveggé is alakíthatjuk. Mivel a MsgBox által kiírt szöveg max. 1024 db karakterből állhat, ezért nagy mennyiségű adat kiírására inkább az alábiakban ismertetésre kerülő megoldást használjuk.

Az adatmegjelenítés történhet a Debug objektum Print metódusának segítségével is, amely a Visual Basic Editor Immediate ablakába ír ki. Az objektumokról a 4. leckében, az Excel objektumairól az 5. leckében lesz szó.

Szintaktika:

Debug.Print [outputlist]
outputlistA kiírandó kifejezést vagy kifejezéseket megadó lista.

A lista egy elemének (kifejezésének) megadási szintaktikája:

[{Spc(n)|Tab(n)}] expression charpos
Spc(n)n db szóköz kiírása (opcionális).
Tab(n)A kiírás az n-edik oszlopban kezdődjön (opcionális).
expressionA kiírandó kifejezés (opcionális).
charposA következő kiírandó adat kezdőpozíciójának megadása (opcionális).

Pl.

Debug.Print ("2*3=" & 2*3)
Debug.Print "2*3="; 2*3; Tab(10); "3*4="; 3*4

Megjegyzés

  • A metódushívásokra a szubrutinok hívási szintaktikája érvényes (lásd 3. lecke, Szubrutinok fejezet).
  • Ha a charpos pontosvessző, akkor az aktuális sorban folytatódik a kiírás, egyébként meg a következő sor elején, így egy Debug.Print hívás utolsó adata után kirakott vagy elhagyott pontosvesszővel szabályozható, hogy a következő Debug.Print hol kezdje a kiírást.
  • Ha a kiírás már meghaladta a Tab(n) által megadott oszlopot, akkor a következő sor n-edik oszlopában folytatódik a kiírás.
  • A kiírandó adatok vesszővel is elválaszthatók, ekkor az adatok 14 karakter szélességben tagolódnak. Az esetlegesen hiányzó elválasztójelek pontosvesszős elválasztásra "alakulnak" a kódszerkesztő ablakban (a sor elhagyásakor).
  • Valós számok kiírásánál, ha nem adunk meg explicit típuskonverziót (pl. a Str függvénnyel, ami tizedespontot használ), akkor az implicit típuskonverzió a CStr függvénnyel történik (ami az operációs rendszerbeli tizedesjelet használja).
  • Az Immediate ablak tartalma szerkeszthető. Szerkesztéskor ügyeljünk arra, hogy a kiírás majd attól a helytől kezdődik el, ahol a kurzor állt, így könnyen összekeveredhetnek az egyes futások által kiírt adatok. Célszerű tehát az ablakban lévő szöveg végére állni (pl. Ctrl+End), vagy törölni az ablak teljes tartalmát (pl. Ctrl+A, Del), mielőtt elindítunk egy programot, amely az Immediate ablakba ír.
  • Az ismertetett utasításokon kívül más eszközök is rendelkezésünkre állnak arra, hogy a programunk adatokat kapjon, illetve adatokat jelenítsen meg. A 4. leckében vizuális vezérlők segítségével, míg az 5. leckében Excel-munkafüzet segítségével valósul meg a felhasználói input/output.
  • A VB általános fájlkezeléséről nem lesz szó, de azt megemlítjük, hogy a fájlkezelő utasítások segítségével adatainkat fájlba menthetjük, illetve onnan visszatölthetjük, így két különböző futás között is megőrizhetjük adatainkat.
Önellenőrző kérdések
1. Az alábbi állítások közül melyek igazak a VB egyszerű adattípusaira vonatkozóan?
A Byte típussal előjeles egész számok is kezelhetők.
Az Integer típussal előjeles egész számok is kezelhetők.
A Long típus 2 bájtot használ egy egész számérték tárolására.
A Double típus 11-12 értékes (decimális) számjegyet biztosít.
A VB Date adattípusával időszámítás előtti dátumokat is kezelhetünk.
A VB Date adattípusával honfoglaláskori dátumokat is kezelhetünk.
2. Az alábbi állítások közül melyek igazak a VB műveleteire vonatkozóan?
A / művelet értelmezett két egész számra.
A \ művelet értelmezett két valós számra.
Az előjel művelet erősebb prioritású, mint a hatványozás művelet.
Az And művelettel összekapcsolt logikai kifejezés igaz, ha valamelyik operandus igaz.
Az Or művelettel összekapcsolt logikai kifejezés hamis, ha mindkét operandus hamis.
A + sztringösszefűző művelet csak sztringeket tud összefűzni.
Az & sztringösszefűző művelet sztringgé konvertálja az operandusait, ha szükséges.
3. Az alábbi állítások közül melyek igazak a VB változók deklarálására vonatkozóan?
Egy változó azonosítója az alulvonás karakterrel is kezdődhet.
Egy változó azonosítójában kis és nagybetűk, valamint magyar ékezetes betűk is szerepelhetnek.
Egy változó azonosítójában a szóköz is szerepelhet.
Ha egy változónak deklaráláskor nem adjuk meg a típusát, akkor a változó Variant típusú lesz.
A VB megengedi a deklarálatlan változók használatát is.
A változók kötelező deklarálása kikényszeríthető.
4. Az alábbi állítások közül melyek igazak a VB kifejezések kiértékelésével kapcsolatosan?
A numerikus (aritmetikai) műveletek prioritása erősebb, mint a szöveges műveleteké.
A logikai műveletek erősebb prioritásúak, mint a hasonlítás műveletek.
A szorzás és osztás műveletek erősebb prioritásúak, mint az egész osztás műveletek.
A balról jobbra szabály az azonos prioritású műveletekre vonatkozik.
Egy kifejezés kiértékelésekor implicit típuskonverziók is végrehajtódhatnak.
A / és a \ azonos prioritású művelet.
Az And művelet a legerősebb prioritású logikai művelet.
5. Az alábbi állítások közül melyek igazak a VB függvényeivel kapcsolatosan?
Az Rnd függvény egy véletlen egész számot ad eredményül.
Az Int függvény kerekít.
A Left függvény második paramétere elhagyható.
A Mid függvény harmadik paramétere elhagyható.
Az InStr függvénynek van opcionális paramétere.
A Format függvény eredménye sztring típusú.

6. Értékelje ki papíron a következő kifejezéseket, majd ellenőrizze az eredményt az Immediate ablak segítségével!

Adja meg a kifejezés eredményét!

3.8\2*3

Adja meg a kifejezés eredményét!

(3.8\2)*3

Adja meg a kifejezés eredményét!

mid("alma",3,1)

Adja meg a kifejezés eredményét!

-2^2

Adja meg a kifejezés eredményét!

(-2)^4

Adja meg a kifejezés eredményét!

int(-3.2)

Adja meg a kifejezés eredményét, ha i=2 és j=16! A változókat használja a kifejezés kiértékelésekor, ne az értéküket (azaz hajtsa végre a megfelelő értékadó utasításokat is)!

i^j

7. Mekkora az i változó által felvehető legkisebb érték, ha az Byte típusú?

A választ kisbetűvel adja meg, felesleges szóközök nélkül!
8. Deklaráljon változót v azonosítóval az alábbi adat tárolására! Ne a Variant típust használja!

Adat: egy személy neve