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

MODUL: Excel programozás

1. lecke: Az Excel VBA használata

Cél: Ebben a leckében a BASIC nyelvről és az Excel VBA fejlesztőkörnyezetről lesz szó. Elsősorban a forrásprogramok megadásához, azok futtatásához, a hibakereséshez kapcsolódó funkciókat részletezzük. Az itt bemutatott ablakok, funkciók, lehetőségek ismerete szükséges ahhoz, hogy a későbbiekben programot tudjunk készíteni. A lecke előremutat, megemlít olyan fogalmakat is, amelyeket csak később fogunk részletesen tárgyalni.

A lecke jó segítség lesz a későbbiekben is, érdemes lesz a programok bevitelénél, tesztelésénél (pl. hibakeresésnél) visszatérni ehhez a fejezethez.

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

  • be tudja állítani Excelben a makró védelmet,
  • el tudja indítani a Visual Basic Editort,
  • a funkcióinak megfelelően használni tudja a Visual Basic Editor ablakait,
  • használni tudja a Súgót, illetve az Objektumtallózót.

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

Kulcsfogalmak

  • Visual Basic
  • MS Visual Basic for Applications
  • Makró
  • Immediate ablak
  • Project ablak
  • Properties ablak
  • Kódszerkesztő ablak
  • Modulok
  • Fordítás
  • Futtatás
  • Hibakeresés
  • Súgó
  • Objektumtallózó
A Visual Basic programozási nyelv

A BASIC (Beginner's All-purpose Symbolic Instruction Code) programnyelvet oktatási célokra hozták létre 1964-ben (Dartmouth College USA, Kemény János és Thomas Kurtz). Az általános célú felhasználhatóság és a könnyű tanulhatóság elsődleges szempont volt, ez a mozaikszó szavaiból is kiderül.

A BASIC programozási nyelv magas szintű, az emberi gondolkodáshoz, jelölésrendszerhez közel álló programozási nyelv. A BASIC nyelven megírt programokat (az ún. forrásprogramokat) a számítógép nem tudja egyből végrehajtani. Ezek végrehajtásához fordítás (compile) vagy értelmezés (interpretation) szükséges. A fordítóprogramok a teljes forrásprogramot lefordítják a számítógép által már végrehajtható utasításokká, míg az értelmezők utasításonként értelmezik és hajtják végre a forrásprogramot.

A nyelvnek többféle változata létezett, kezdve az iskola-számítógépek beépített BASIC értelmezőjétől, a 80-as években elterjedt személyi számítógépek Qbasic-jén keresztül, az 1991-ben megjelent Microsoft Visual Basic (röviden VB) nyelvig. A Visual Basic for Applications (röviden VBA) az MS Office szoftverek makrónyelve, a Visual Basic Script a Windows operációs rendszer scriptnyelve, a 2002-ben megjelent Visual Basic .NET pedig a .NET keretrendszer programozási nyelve.

A Visual Basic nyelv után ejtsünk néhány szót a nyelvet használó szoftverfejlesztő rendszerekről is.

Az MS Visual Studio egy általános célú szoftverfejlesztő keretrendszer, amelyben többféle (pl. Visual Basic, C#) programnyelven is fejleszthetünk.

Az MS Visual Basic for Applications (pl. az általunk használt Excel VBA) főbb tulajdonságai:

  • Csak Visual Basic nyelven programozhatunk, (a Visual Studio-hoz képest) korlátozott fejlesztési eszköztár mellett.
  • Csak az adott szoftverrel (pl. Excel) együtt használható.
  • Önállóan futtatható (*.exe) fájlok nem készíthetők.
  • Az adott szoftverhez igazodó, "készen kapott" objektumrendszert tartalmaz.

Az egyes utasításoknál megadjuk az utasítások (esetleg egyszerűsített) szintaktikáját. Az egyszerűsítéssel a lényeges dolgok kiemelése a célunk, az utasítások teljes szintaktikája a súgóban megtalálható.

Megjegyzés

  • Tananyagunkban az MS Excel 2010 VBA segítségével szemléltetünk, a leírások is ehhez igazodnak, de más Excel verziók (pl. 2003, 2013, 2016) VBA környezete is alkalmas a tanulásra, a feladatok megoldására (mert ezek korántsem változtak annyit, mint az egyes Excel verziók).
  • Az utasítások szintaktikájában a szögletes zárójelben lévő részek elhagyhatók, a kapcsos zárójelek között, függőleges vonallal elválasztva választási lehetőségek felsorolása található, a három pont a tetszőleges számú ismétlés jelölésére szolgál.
Makrók

"A makró parancsok sorozata, amely ismétlődő feladatok végrehajtásának automatizálására használható." - idézet az Excel súgójából. A makró szó az adott MS Office (esetünkben az MS Excel) alkalmazás programfejlesztő környezetében létrehozott objektumok és VBA forráskódok általános, összefoglaló elnevezése. Az Excel 2010 a makrókat tartalmazó dokumentumokra a "Makróbarát Excel munkafüzet" elnevezést használja. A makrókat tartalmazó dokumentumokat ilyen fájlként mentsük (ezek kiterjesztése xlsm).

Hozzon létre egy új munkafüzetet Excel 2010-ben, majd mentse el xlsm kiterjesztéssel!

A makróvírusok elterjedésének megakadályozása érdekében az Excel bizonyos beállításai a makrókat tartalmazó dokumentumok kezelésére vonatkoznak. A Fájl, Beállítások, Adatvédelmi központ (lásd 1. ábra) ablakban a jobb alsó sarokban található "Az Adatvédelmi központ beállításai..." nyomógomb segítségével (többek között) megadhatók a makrókra vonatkozó beállítások is (lásd 2. ábra).

Az adatvédelmi központ
1. ábra

Ahhoz, hogy a makrókat tartalmazó dokumentumok megnyitásakor eldönthessük, hogy engedélyezzük vagy letiltjuk az adott dokumentumban lévő makrókat, az "Összes makró letiltása értesítéssel" választógombot kell bekapcsolni (lásd 2. ábra). Ebben az esetben egy makrókat tartalmazó dokumentum megnyitásakor üzenetet kapunk. Ha a Visual Basic Editor meg van nyitva, akkor a 3. ábrán szereplő párbeszédablak jelenik meg, egyébként meg a 4. ábrán látható üzenetsáv. Mindkét esetben engedélyezhetjük a dokumentumban lévő makrókat.

Az engedélyezés, illetve letiltás csak a makrók futtatására vonatkozik, így letiltott esetben is megnézhetjük, sőt akár módosíthatjuk is a makrókat. Az engedélyezés, illetve tiltás (adott dokumentumra vonatkozó) megváltoztatásához zárjuk be és nyissuk meg újra (a kívánt módon) az adott dokumentumot.

Az adatvédelmi központ makróbeállításai
2. ábra
Makrók engedélyezése, illetve letiltása párbeszédablak
3. ábra
Makrók engedélyezése, illetve letiltása üzenetsáv
4. ábra

Megjegyzés

  • Ha a 4. ábrán látható sárga színű üzenetsávban engedélyezzük a makrókat ("Tartalom engedélyezése" gomb), akkor az adott számítógépen a dokumentum megbízható dokumentumként kezelődik a továbbiakban, ezért újabb megnyitásakor már nem kell külön engedélyezni a makrókat, egyébként (az üzenetsáv bezárásával) meghagyjuk a makrók letiltását.
  • Egy újonnan létrehozott munkafüzetben készített makrók a beállításoktól függetlenül mindig futtathatók.

Állítsa be a védelmet a 2. ábrán látható módon!

A Visual Basic Editor

Alapértelmezésben az Excel menüszalagján nem látható a Fejlesztőeszközök lap (lásd 6. ábra), amelyen a Visual Basic fejlesztőrendszer, a Visual Basic Editor elérhető, de a gyorsbillentyűjével (Alt+F11) ekkor is megnyitható. A Fejlesztőeszközök lap megjelenítéséhez a Fájl, Beállítások, Menüszalag testreszabása párbeszédablakban be kell kapcsolni a lap megjelenítését szabályozó jelölőnégyzetet (lásd 5. ábra).

A menüszalag testreszabása
5. ábra
A menüszalag Fejlesztőeszközök lapja
6. ábra

A Visual Basic Editor egy önálló ablakban jelenik meg, de az Excel bezárásával ez az ablak is bezáródik. A fejlesztőkörnyezet angol nyelvű (menü, súgó, hibaüzenetek stb.), hiába magyar nyelvű az Excel, amihez tartozik.

A Visual Basic Editor
7. ábra

Bár az ablak elrendezése beállítható, egy tipikus elrendezés a 7. ábrán látható. Felül a menüsor, alatta az eszköztársor, balra fent a Project ablak, alatta a Properties ablak, a jobb oldali, szürke hátterű munkaterületen most két ablak látható. Az egyik a UserForm1 objektum tervezőablaka, a másik a UserForm1 objektumhoz tartozó forráskód szerkesztőablaka. A munkaterület alatt az Immediate ablak látható.

Valamennyi ablak szabadon megjeleníthető, méretezhető, más helyre tehető, vagy akár be is zárható. A View menü segítségével (lásd 8. ábra) bármikor újra megjeleníthető egy bezárt ablak. A gyakran használatos funkciók a helyi menü segítségével, vagy a hozzájuk tartozó gyorsbillentyűkkel is aktivizálhatók (pl. F7, Shift+F7). A helyi menü (a Windowsban megszokott módon) az adott helyen, az egér jobb gombjával hozható be.

Megjegyzés

  • A Visual Basic Editorban létrehozott makrókat nem kell külön menteni, ezek a munkafüzet mentésekor elmentődnek. A Visual Basic Editor mentés (Save) funkciója az egész munkafüzetet menti (csakúgy, mint az Excelbeli mentés funkció).
  • Bizonyos ablakok (pl. Project, Properties, Immediate) rögzíthetők (dockable) a munkaterületen, sőt akár a Visual Basic Editor ablakán kívülre is mozgathatók. Az ablakelrendezés (mely ablakok hol és mekkora méretben jelennek meg) megőrződik, minden belépéskor a legutóbbi ablakelrendezésben jelenik meg a Visual Basic Editor.
  • A nem rögzíthető ablakok a nyitáson és záráson kívül még minimalizálhatók (amikor is ikonként a munkaterület aljára kerülnek) és maximalizálhatók (ilyenkor a teljes munkaterületet kitöltik eltakarva egymást). A nyitott ablakok közötti váltás a kívánt ablakon való kattintás mellett, a Window menü segítségével is elvégezhető, amely a Windows alkalmazásokban szokásos funkciókkal (ablakok különféle elrendezése, a nyitott ablakok listája stb.) rendelkezik (lásd 8. ábra).
A Visual Basic Editor View és Window menüje
8. ábra

Az egyes ablakok szerepéről a következő alfejezetekben lesz szó.

Az Immediate ablak

Az Immediate ablak amellett, hogy a programok egyik output megjelenítő eszköze, utasítások közvetlen végrehajtására is használható. A végrehajtani kívánt utasításokat egy sorba kell írni, több utasítás esetén az utasítások közé kettőspontot kell tenni. A végrehajtást az Enter billentyű leütésével kérhetjük.

Az Immediate ablak tartalma szabadon szerkeszthető, így pl. a korábban végrehajtott sorok (esetleges módosítással) újra végrehajthatók (nem kell, hogy a sor végén álljon a kuzror, amikor leütjük az Enter billentyűt), a felesleges sorok törölhetők stb.

Próbálja ki az Immediate ablakban az alábbi utasítások végrehajtását!

print 2^16
? 2^(1/2)

Megjegyzés

  • A print és a ? a Debug objektum Print metódusát (Debug.Print) hivatkozza röviden. Erről a 2. leckében az Adatok kiírása fejezetben lesz szó.
  • Nem minden VB utasítás hajtható végre az Immediate ablakban (pl. Dim utasítás).
  • Természetesen itt is csak szintaktikailag helyes utasítások hajthatók végre. Az esetleges hibaüzenetet az Enter billentyű leütése után kapjuk meg (szemben a kódszerkesztő ablakban beírt utasításokkal, ahol (alapértelmezésben) már a szintaktikailag hibás sor elhagyásakor megkapjuk a megfelelő hibaüzenetet.
  • Az Immediate ablakban csak akkor lehet utasításokat végrehajtani, ha a munkafüzetre vonatkozó biztonsági beállítások engedélyezik a makrók futtatását.
A Project ablak

Az MS Office VBA fejlesztőkörnyezetben a projektek foglalják egységbe az adott dokumentumot a hozzá tartozó makrókkal. A projekt az adott dokumentumfájlban tárolt objektumok áttekinthetőségét, kezelését hivatott szolgálni. A Project ablak a Visual Basic Editor View menüjének Project Explorer funkciójával (lásd 8. ábra) jeleníthető meg.

Egy Excel-projektben az alábbi objektumok szerepelnek, illetve szerepelhetnek:

  • Excel-objektumok (Microsoft Excel Objects)
    • Az egyes munkalapok (Munka1, ...)
    • A munkafüzet (ThisWorkbook)
  • Formok (Forms)
  • Modulok (Modules)
  • Osztálymodulok (Class Modules)

Az Excel-objektumok csoport elemei az adott munkafüzethez igazodnak (pl. annyi munkalap objektum szerepel a projektben, ahány munkalapja van az adott munkafüzetnek). A munkalap objektumokkal az egyes munkalapok, a ThisWorkbook objektummal a (makrókat tartalmazó) munkafüzet hivatkozható. Ezek az objektumok nem hozhatók létre, illetve nem törölhetők a Visual Basic Editorban, de a hozzájuk tartozó esetleges eseménykezelők (pl. a munkafüzet megnyitása, bezárása, egy munkalap aktivizálása stb.) az objektumhoz tartozó modulban definiálhatók.

A többi csoport (formok, modulok, osztálymodulok) elemeit szabadabban kezelhetjük. Létrehozhatunk (Insert), törölhetünk (Remove), behozhatunk (Import), kivihetünk (Export) elemeket.

A formokról, a vizuális formtervezésről a 4. leckében lesz szó. A modulok csoport moduljai a forráskódok megadására használatosak. A logikailag összetartozó forráskódokat célszerű egy modulba tenni. Az eseménykezelőket a megfelelő objektum moduljában (azaz nem a modulok csoportban) kell elhelyezni. A modulok felépítéséről egy későbbi fejezetben lesz szó.

Az osztálymodulokban osztályokat (objektumtípusokat) definiálhatunk.

Az objektumokhoz tartozó modulok megnyitása (a Project ablak megfelelő elemének kiválasztása után) a View menü Code funkciójával (lásd 8. ábra), vagy a Project ablak helyi menüjének View Code funkciójával (lásd 10. ábra) történhet. A modulok csoport moduljait még (a megfelelő modulon való) dupla kattintással is megnyithatjuk.

Új objektum létrehozása a Visual Basic Editor Insert menüjével (lásd 9. ábra), vagy a Project ablak helyi menüjével (lásd 10. ábra) történhet. A menükben található menüpontok választhatósága az aktuális állapottól (kódszerkesztésben voltunk-e éppen vagy sem), illetve a Project ablak aktuális elemétől függ.

A Visual Basic Editor Insert menüje
9. ábra
A Project ablak helyi menüje
10. ábra

A Project ablak elemeit a helyi menü Remove funkciójával törölhetjük, ahol a menüpont felirata a kiválasztott objektum nevét is tartalmazza (lásd 10. ábra bal oldali képét, ahol a UserForm1 objektum helyi menüje látható). A törlés előtt lehetőségünk van a törölt elem exportálására (azaz önálló fájlként való kimentésére), ami egyébként a helyi menü Export File... funkciójával is megtehető.

Az Import File... funkcióval betölthetünk és az aktuális projekthez adhatunk önálló fájlokban lévő formokat (*.frm), modulokat (*.bas), osztálymodulokat (*.cls). Az export és import funkciókkal tehát könnyen tudunk objektumokat átvinni projektek között.

A Properties ablak

A Properties (tulajdonságok) ablak a projekthez tartozó objektumok tulajdonságainak megjelenítésére és azok tervezéskori megadására, módosítására használatos. A vizuális formtervezés során (lásd 4. lecke) itt adjuk meg az adott form, illetve a formon lévő vezérlők tulajdonságait (lásd 11. ábra).

Az ablak tetején lévő legördülő listában kiválasztható az a vezérlő (a formot is beleértve), amelynek tulajdonságait látni, illetve megadni szeretnénk. A tulajdonságokat kétféle sorrendben tudjuk megjeleníteni (a megfelelő fül kiválasztásával): névsor szerint (Alphabetic fül), vagy a tulajdonságokat kategóriák szerint csoportosítva (Categorized fül). Ha már tudjuk az adott tulajdonság nevét, akkor a névsor szerinti fülön gyorsan megtaláljuk, különben célszerű a kategorizált fülön keresgélni, hiszen ott az összes tulajdonság helyett elegendő azon csoport végignézése, amelyikhez a keresett tulajdonság tartozik.

A Properties ablak
11. ábra

A Properties ablakban (mindkét fül esetén) két oszlop látható, a bal oldali a tulajdonságok neveit, a jobb oldali azok aktuális értékeit tartalmazza. Az adatok megadása a jobb oldali oszlopban történik, ahol is az adott tulajdonságtól függően vagy begépeljük a tulajdonság értékét (pl. Name, Caption, Left), vagy egy készletből kiválasztjuk (pl. Enabled, MousePointer, PictureAlignment), vagy egy párbeszédablakkal adjuk meg (pl. Font, Picture).

A begépeléssel megadott adatok értéke ellenőrződik, érvénytelen adat esetén (pl. szám helyett szöveget adunk meg) hibaüzenetet kapunk (lásd 12. ábra).

Érvénytelen tulajdonság értékről tájékoztató hibaüzenet
12. ábra
A kódszerkesztő ablak

A kódszerkesztő ablak a VBA forráskódok megírására, azok módosítására szolgál. A forráskódok modulokba, azon belül pedig szubrutinokba (lásd 3. lecke) szervezettek. A kódszerkesztő ablak tetején két legördülő lista található, a bal oldaliban az objektumok, a jobb oldaliban a szubrutinok nevei jelennek meg, illetve választhatók ki.

A kódszerkesztő ablak
13. ábra

A listák tartalma egyfelől igazodik a kurzor aktuális (forráskódbeli) helyéhez, másfelől segítségükkel gyorsan rápozícionálhatunk a modul kívánt részére. Választáskor általában először a bal oldali listából, utána a jobb oldaliból választunk, mert a jobb oldali lista tartalma a bal oldali lista aktuális eleméhez igazodik.

A bal oldali listában az első elem mindig egy (General) nevű elem. Ha ez az elem van kiválasztva, akkor a jobb oldali listában az első elem egy (Declarations) nevű elem (lásd 13. ábra), a többi elem pedig a modulban található általános (nem eseménykezelő) szubrutinok nevei. A (Declarations) elem kiválasztása a modul elejére pozícionál (azaz a deklarációs részre, ahol a modulszintű utasítások találhatók, lásd következő fejezet), egyébként meg a kiválasztott szubrutin elejére.

A legördülő listák tipikus tartalma egy formhoz tartozó modul esetén
14. ábra

A bal oldali listában (a (General) elemen kívül) az adott modul objektumai (azok nevei) jelennek meg (pl. egy form moduljában a form és a rajta található vezérlők (lásd 14. ábra), a munkafüzethez tartozó modulban a munkafüzet objektum). Egy még nem definiált eseménykezelő kiválasztása létrehozza az adott eseménykezelőt üres tartalommal, amit szerkeszthetünk (lásd 15. ábra), egyébként meg a kiválasztott eseménykezelő elejére ugrik a kurzor a kódszerkesztő ablakban.

Egy létrehozott új eseménykezelő
15. ábra

A kódszerkesztő "viselkedése" a hozzá tartozó beállításoktól is függ. A beállításokról, az egyéb funkciókról (pl. szókiegészítés) a jegyzetben (Kallós-Pusztai 2016) olvashatunk.

A forráskód szerkesztésekor (az alapértelmezett beállítások mellett) egy szintaktikailag helytelen sor elhagyásakor hibaüzenetet kapunk és a sor (alapértelmezésben piros színnel) kiemelődik. A szintaktikailag helyes sorok általában "átalakulnak": a kulcsszavak kiemelődnek (alapértelmezésben kék színnel), a felismert (azaz nem elgépelt) azonosítók a deklaráláskor megadott alakban (kis- és nagybetű) jelennek meg, esetlegesen szóközök szúródnak be, illetve felesleges szóközök törlődnek. Ez az "egységesített küllem" javítja az áttekinthetőséget, a forráskód olvashatóságát.

Megjegyzés: Az, hogy egy forrásprogram sorainak begépelésekor, módosításakor az adott sort elhagyva nem kapunk hibaüzenetet, még nem jelenti a program teljes szintaktikai helyességét (pl. ha lehagyjuk egy For ciklus végéről a Next utasítást, akkor hiába helyesek a ciklus már megadott sorai, a hiányzó rész miatt nem lehet szintaktikailag helyes a ciklusszervezés, így a forrásprogram sem). A forrásprogramok szintaktikai hibáinak a kiszűréséről, a projekt fordításáról a következő fejezet utáni fejezetben lesz szó.

Modulok felépítése

Minden modul, legyen az objektumhoz tartozó vagy önálló modul, ugyanazt az egyszerű felépítést követi. A modul elején a modulszintű utasításokat kell megadni, amelyeket a modul szubrutinjai követnek.

Modulszintű utasítások

  • Deftype utasítások (pl. DefInt)
  • Opciókat megadó utasítások (pl. Option Explicit)
  • Típusdeklarációk (pl. Type, Enum)
  • Modulszintű konstansok (Const), illetve változók (Public, Private, Dim) deklarálása

Megjegyzés: Az opciókat megadó utasításokkal a Visual Basic fordító/értelmező működését szabályozhatjuk. Ezek, illetve a Deftype utasítások érvényessége (scope) csak az adott modulra terjed ki. A modulszintű típus, konstans és változó deklaráció azonban deklarálhat más modulból is hivatkozható (publikus) elemeket is.

Fordítás, futtatás, hibakeresés

A forrásprogramok írásakor a kódszerkesztő már ellenőrizni tudja az adott sor szintaktikáját. A Visual Basic Editor Debug menüjének Compile VBAProject funkciójával (lásd 16. ábra) az adott projekthez tartozó összes forrásprogram lefordítható. Ezzel kiszűrhetők a forrásprogramok szintaktikai (formai) hibái, ugyanis az első megtalált hibáról üzenetet kapunk, a kódszerkesztő ablakban ez a kódrészlet jelenik meg úgy, hogy a hibás sor kiemelődik. A hibát persze nekünk kell kijavítanunk, ezt nem teszi meg helyettünk a fejlesztőrendszer.

A Visual Basic Editor Debug és Run menüje
16. ábra

A forráskódok természetesen nemcsak fordíthatók, de futtathatók is. A futtatás funkció a Run menü Run Sub/UserForm funkciójával (lásd 16. ábra) végezhető. A funkció neve is utal arra, hogy egy szubrutint, vagy egy felhasználó által készített formot (UserForm) lehet futtatni, és a kettő között különbség van, ugyanis, ha egy formhoz tartozó modulban kérjük ezt a funkciót (pl. az F5 gyorsbillentyűvel), akkor függetlenül attól, hogy a modul mely részén áll a kurzor, a form futtatását kérjük. Az ilyen modulban lévő szubrutinok tehát nem futtathatók külön-külön.

Más a helyzet a többi (nem formhoz tartozó) modullal. Itt ugyanis minden olyan szubrutin külön futtatható, amelynek nincsen paramétere. Álljunk a kurzorral a futtatni kívánt szubrutin egy sorára és kérjük a futtatás funkciót. Ekkor a szubrutin fordítása is megtörténik (így a szubrutin esetleges szintaktikai hibái is kiderülnek). A paraméterrel rendelkező szubrutinokat nem lehet közvetlenül futtatni, ezek csak közvetve, valamilyen őket meghívó szubrutin segítségével (vagy az Immediate ablakban kiadott hívással) futtathatók.

Ha az aktuális sor nem tartozik egyik szubrutinhoz sem (pl. két szubrutin közötti üres soron vagy a modul deklarációs részében áll a kurzor), akkor a futtatás funkció egy párbeszédablakot jelenít meg (ugyanezt teszi a Tools menü Macros... funkciója is), amelyben a modulban található futtatható (paraméter nélküli) szubrutinok listája jelenik meg (lásd 17. ábra). Az ablakban kiválasztható a futtatandó (Run), lépésenként futtatandó (Step Into), szerkesztendő (Edit), vagy törlendő (Delete) szubrutin, amely akár egy másik projektben is lehet (mivel a Macros In legördülő lista segítségével akár az összes nyitott projekt futtatható szubrutinjának nevét is megjeleníthetjük a makrókat tartalmazó listában).

A futtatható szubrutinok párbeszédablaka
17. ábra

Egy program futásának megszakítása a Run menü Break funkciójával kérhető, amelynek gyorsbillentyűje Ctrl+Break vagy Esc (pl. egy végtelen ciklusba esett program futását csak ezekkel a billentyűkkel lehet megszakítani). A megszakított programfutás esetén a futás folytatható (Continue), leállítható (End), illetve felfüggeszthető (Debug) (lásd 18. ábra).

A megszakított programfutás párbeszédablaka
18. ábra

Egy futó (vagy futásában felfüggesztett) program futásának a befejezése a Run menü Reset funkciójával kérhető. A Run menü funkciói az eszköztársor segítségével is aktivizálhatók.

Egy program helyes működésének tesztelése a programfejlesztői munka része. Sajnos gyakran előfordul, hogy a szintaktikailag helyes programunk nem úgy működik, ahogy szeretnénk. A programok szemantikai (tartalmi, jelentésbeli, logikai) hibáinak feltárása már nehezebb feladat.

A programfejlesztő rendszerek (így a VBA is) speciális funkciókat biztosítanak a programok szemantikai hibáinak felderítésére. Ezek a funkciók alapvetően két fontos szolgáltatást nyújtanak: megtudhatjuk, hogy merre halad a vezérlés (milyen utasítások kerülnek végrehajtásra), és hogy az egyes változókban milyen értékek vannak.

Lépésenkénti futtatás és a Watches ablak
19. ábra

A programok lépésenkénti futtatása a Debug menü Step Into funkciójával végezhető. Ez azt jelenti, hogy a végrehajtás utasításonként (de mivel általában egy sorba egy utasítást írunk, ezért gyakorlatilag soronként) történik, és minden egyes utasítás végrehajtása előtt a program futása felfüggesztődik. Ekkor lehetőségünk van a változók tartalmának megtekintésére (esetleges módosítására), majd a futás folytatására, illetve a futás leállítására (ha pl. már rájöttünk az esetleges hibára). Az éppen végrehajtásra kerülő utasítás (alapértelmezésben) sárga háttérszínnel (és a margó sávon egy sárga nyíllal) emelődik ki (lásd 19. ábra).

Egy hosszabb forrásprogram esetén hasznos lehet, ha csak ott kezdjük el a lépésenkénti futtatást, ahol a hibát sejtjük. Ez megtehető a forráskódban elhelyezhető töréspontok (Breakpoints) segítségével. A töréspontok adott sorra való elhelyezése, illetve levétele a Debug menü Toggle Breakpoint funkciójával végezhető. A programfutás egy töréspontra érve felfüggesztődik (azaz lehetőségünk van a lépésenkénti futtatásra stb.). A töréspontok sorát a margón egy kör jelzi, míg a sor (alapértelmezésben) bordó háttérszínnel emelődik ki (lásd 20. ábra).

A forráskód egy adott soráig való futtatás (Debug menü Run To Cursor funkció) is azt a célt szolgálja, hogy ott függesszük fel a program futását, ahol a hibát sejtjük.

A változók értékeinek megfigyelési (Watches) ablakát (lásd 19. ábra) a View menü Watch Window funkciójával (lásd 8. ábra) jeleníthetjük meg.

A tömb- és rekordváltozók az előttük megjelenő (mínusz, plusz) ikonokkal becsukhatók, illetve kinyithatók így az egyes tömbelemek, illetve rekordmezők is megtekinthetők (lásd 19. ábra).

Egy törésponton felfüggesztett programfutás a Watches és az Add Watch ablakokkal
20. ábra
Egy változó értékének megjelenítése az egérkurzor segítségével
21. ábra

Felfüggesztett programfutás esetén az egyszerű adattípusú (lásd 2. lecke) változók tartalma úgy is megtekinthető, hogy az egérrel az adott változó fölé pozícionálunk (lásd 21. ábra). Az összetett adattípusú (lásd 4. lecke) változók tartalma sajnos így nem nézhető meg, de a Watches ablakban ezek tartalma is megjeleníthető (lásd 19. ábra).

A súgó és az objektumtallózó

Munkánkat a súgó, illetve az objektumtallózó (Object Browser) funkció segítheti. Míg a (környezetfüggő/helyérzékeny) súgó a Windowsban megszokott módon (az F1 billentyű lenyomásával vagy menüből) érhető el és használható (pl. keresés, tartalomjegyzék stb., lásd 22. ábra), addig az Object Browser az F2 billentyűvel (vagy a View menüből, lásd 8. ábra ) aktivizálható.

A Visual Basic Editor súgója
22. ábra

Az objektumtallózóban (lásd 23. ábra) egyben láthatjuk az osztályok (Classes) (így pl. az egyes vezérlők, mint a példában szereplő ListBox vezérlő) tulajdonságait (pl. BackColor), metódusait (pl. AddItem) és eseménykezelőit (pl. BeforeDragOver). Az ablakban kereső és súgó funkció is használható. A súgó itt is környezetfüggő, azaz a kérdőjel ikonnal (vagy az F1 leütésével) éppen a 22. ábrán látható súgótartalom jeleníthető meg, de ha a jobb oldali listában választunk ki egy elemet (pl. AddItem), akkor az ahhoz tartozó súgóoldal jelenik meg.

Az Object Browser
23. ábra

Az Object Browser ablak (bal felső sarkában található) Project/Library legördülő listájával kiválasztható az a projekt, illetve rendszerkönyvtár (Library), amelynek tartalmát megjeleníteni szeretnénk (lásd 24. ábra). A 23. ábrán az All Libraries elem van kiválasztva, így minden elérhető osztály megjelenik a Classes listában.

Az Object Browser ablak Project/Library legördülő listájának tartalma
24. ábra

Hozzon létre egy új modult (Insert, Module), majd írja be a kódszerkesztő ablakba a következő szubrutint (miközben vegye észre a kódszerkesztő által automatikusan elvégzett szolgáltatásokat)! Fordítsa le, majd futtassa a szubrutint!

Sub elso()
  MsgBox "Helló Világ!"
End Sub

Vétsen valamilyen szintaktikai hibát (pl. End Sub helyett End Sum-ot, vagy csak End-et ír, lehagyja a macskakörmöket [egyiket, másikat, mindkettőt]), majd próbálja elhagyni a kurzorral a hibás sort! Próbálja ki a fordítás és futtatás funkciókat ilyen forrásprogram esetén is!

A macskakörmök nélküli esetben próbálja ki felkiáltójel nélkül is a futást! A kicsit furcsának tűnő működés megértéséhez a 2. leckében lévő ismeretek is szükségesek.

Álljon a kurzorral valamelyik szóra (pl. Sub, MsgBox), majd kérjen súgót az F1 billentyű leütésével! Próbálja ki a súgó szolgáltatásait (pl. keresés, tartalomjegyzék, ugrás egy-egy kapcsolódó súgóoldalra stb.)!

Hozza be az objektumtallózó ablakát és próbálja ki a szolgáltatásait (pl. keresés, súgó stb.)!

Önellenőrző kérdések
1. Az alábbi állítások közül melyek igazak az Excel VBA fejlesztőkörnyezetre vonatkozóan?
Csak VB nyelven programozhatunk.
Az Excel nélkül is használható.
Önállóan futtatható (*.exe) fájlok készíthetők.
A forrásprogramokat C# nyelven is megírhatjuk.
Az Excel objektumok kezelését objektumrendszer támogatja.
Eseményvezérelt programozást biztosít.
Nem támogatja a vizuális tervezést.
Magas szintű programozási nyelven programozható.
2. Az alábbi állítások közül melyek igazak a makrókkal kapcsolatosan?
A VBA forráskódok egyben makrók is.
Egy makrókat tartalmazó dokumentum megnyitásakor meg kell adni, hogy engedélyezzük a dokumentumban lévő makrókat vagy sem.
A nem engedélyezett makrók nem láthatók és nem módosíthatók.
A makrók engedélyezése a makrók futtatására vonatkozik.
Egy új dokumentumban létrehozott makrók futtathatók.
A makrók is mentődnek a dokumentum mentésekor, ha annak formátuma megfelelő.
3. Az alábbi állítások közül melyek igazak a Visual Basic Editor-ral kapcsolatosan?
A VBE az Alt+F11 gyorsbillentyűvel akkor is elindítható, ha az Excel menüjében nem látható az indítást végző ikon.
Ha a makrók nem engedélyezettek egy dokumentumban, akkor az Immediate ablakban sem hajthatunk végre utasításokat.
Az Immediate ablak teljes tartalma törölhető.
A Project ablak elemei az ablak helyi menüjének segítségével törölhetők.
A Properties ablakban az Alphabetic fülön a név (Name) tulajdonság a rendezettségnek megfelelő helyen jelenik meg a tulajdonságok között.
A kódszerkesztő ablak legördülő listáiból való választás egy új eseménykezelőt nyit.
4. Az alábbi állítások közül melyek igazak a fordítás, futtatás, hibakereséssel kapcsolatosan?
A szubrutinokat egyenként is lefordíthatjuk.
Egy végtelen ciklusba esett program futása megszakítható.
Egy törésponton a program futása befejeződik.
A Watches ablakban összetett típusú változók tartalma is megjeleníthető.
Egy VBA projekt fordításával a forrásprogram szemantikai hibáit keressük meg.
A hibakereső, nyomkövető funkciókkal a forrásprogram szintaktikai hibáit keressük meg.