420 likes | 526 Vues
Pénzügyi feladatok VBA támogatása 9 . előadás. Barna Róbert KE GTK Informatika Tanszék. Pénzügyi feladatok VBA támogatása 9 . előadás. Barna Róbert KE GTK Informatika Tanszék. Hibakezelés.
E N D
Pénzügyi feladatok VBA támogatása 9. előadás Barna Róbert KE GTK Informatika Tanszék
Pénzügyi feladatok VBA támogatása 9. előadás Barna Róbert KE GTK Informatika Tanszék
Hibakezelés Kézi megszakítás esetén - vagy ha futási hiba keletkezik - a VBA hibaüzenetet ír ki és megszakított módban leáll. Az ilyenkor megjelenő Microsoft Visual Basic feliratú ablakban a hiba kódján és a hibaüzenet szövegén kívül négy nyomógomb is látható; ezekkel a következőket művelhetjük: Pénzügyi feladatok VBA támogatása – 9. előadás 4 /41
Hibakezelés 1. Ha a VÉGE [End] gombra kattintunk vagy leütjük az Esc billentyűt, befejeződik a rutin futása, és a kurzor az utoljára aktivált munkalap aktív cellájára áll. 2. A TOVÁBB [Continue] gomb csak kézi megszakítás esetén látható; ha erre kattintunk, a rutin változtatás nélkül továbbfut. Pénzügyi feladatok VBA támogatása – 9. előadás 5 /41
Hibakezelés 3. A HIBAKERESÉS [Debug] gomb hatására a VBA a hibás programsorra pozicionálja a kurzort, és megszakított módban marad. Ilyenkor a próbafuttatásokkal kapcsolatosan fentebb ismertetett tevékenységeket végezhetjük. 4. A SÚGÓ [Help] gomb lenyomására részletesebb tájékoztatást kapunk a hiba természetéről és feltehető okáról, valamint javításának tehetséges módjairól. A súgóablak bezárása után a fenti három eset közül lehet választani. Pénzügyi feladatok VBA támogatása – 9. előadás 6 /41
Hibakezelés A hibák két osztályba sorolhatók: 1. A súlyos hiba [FatalError] a futás során nem javítható. Ha ilyet termeltünk, nincs mit tenni: a VÉGE [End] gombbal le kell állítani a rutint és ki kell javítani a hibát. (Súlyos hiba például a hivatkozás nem létező rutinra.) Pénzügyi feladatok VBA támogatása – 9. előadás 7 /41
Hibakezelés 2. Vannak azonban követhető hibák [trappable error], amelyeket menet közben is ki lehet javítani. Ilyen hiba például hivatkozás nem megnyitott állományra vagy nem aktivált munkalapra stb. Egy-egy követhető hiba kijavítása után érdemes a rutint tovább futtatni, esetleges további hibák felderítése végett. A követhető hibáknak van még egy nagyon kellemes tulajdonságuk: automatikusan is kezelhetők, ha a programot felkészítjük ilyen esetekre. Pénzügyi feladatok VBA támogatása – 9. előadás 8 /41
Rendszerhibakódok elemzése Ha el akarjuk kerülni azt a bosszantó jelenséget, hogy rutinunk futása megszakad egy futási hiba miatt, magunkhoz kell ragadnunk a hibaüzenetek feldolgozását. Mint tudjuk ez az egyetlen eset, amikor legálisan használhatunk ugró utasításokat. A hiba „megragadására” a On Error Goto cimke hibakövető utasítás szolgál, amely kikapcsolja a beépített hibakezelést. Pénzügyi feladatok VBA támogatása – 9. előadás 9 /41
Rendszerhibakódok elemzése Így futási hiba előfordulásakor a vezérlés a címkét tartalmazó (üres sor esetén a következő) utasításra kerül. Az itt kialakított hibaelemző blokkban (utasításcsoportban) elemezhetjük a hiba okát és természetét, valamint javító lépéseket iktathatunk be. Pénzügyi feladatok VBA támogatása – 9. előadás 10 /41
Rendszerhibakódok elemzése A címkének ugyanabban a rutinban - továbbiakban hibakezelő - kell lennie, ahol a hibakövető utasítás van. A beépített hibakezelés mindaddig kikapcsolt állapotban marad, amíg az On Error Goto 0 visszaállító utasítással vissza nem kapcsoljuk. Ha ezt elmulasztottuk, a VBA automatikusan megteszi, amikor a hibakezelő rutin befejeződik. Pénzügyi feladatok VBA támogatása – 9. előadás 11 /41
Rendszerhibakódok elemzése Hibakövető és visszaállító utasításokat bárhol és akárhányszor el lehet helyezni a rutinokban. Így lehetőségünk nyílik arra, hogy a rendszer hibakezelését egyes programrészekre korlátozzuk, másutt viszont saját hibaelemzést végezzünk. Fontos azonban tudni, hogy a hibakövető utasítás a teljes hívási láncra vonatkozik! Más szóval: egymásba ágyazott rutinhívások esetén bármelyik rutinban fordul is elő futási hiba, a vezérlés az utoljára végrehajtott hibakövető utasításban megadott címkére kerül. Pénzügyi feladatok VBA támogatása – 9. előadás 12 /41
Rendszerhibakódok elemzése A hibakövető utasítás legtöbbször a rutin első utasítása, hiszen hatását rendszerint az egész rutinra érvényesíteni akarjuk. A címkével bevezetett hibaelemző programrészt viszont a rutin végén célszerű elhelyezni, mivel csak hiba esetén kell lefutnia. Ha így jártunk el, hibátlan esetben a címke előtt álló Exit Sub, illetve Exit Function utasítással léphetünk ki a rutinból. Pénzügyi feladatok VBA támogatása – 9. előadás 13 /41
Rendszerhibakódok elemzése A hibaelemző blokkból normál futási módba a Resume utasítással lehet visszatérni. Az utasítás egyszersmind megszünteti a hibaállapotot is, vagyis nullázza a hibakód értékét. Az utasításnak 3 alesete van: - Resume visszaadja a vezérlést arra a programsorra, amelynek végrehajtása okozta a hibát; - Resume Next a vezérlés a hibás sort követő programsorra kerül; - Resume címke a vezérlés a címkével megjelölt sorra kerül; a címkének a hibaelemez blokkot tartalmazó rutinban kell lennie. Pénzügyi feladatok VBA támogatása – 9. előadás 14 /41
Rendszerhibakódok elemzése Pontosabban az első két eset csak akkor érvényes, ha a hiba ugyanabban a rutinban keletkezett, amelyben a hibaelemző blokk is van. Tegyük fel, hogy ez az A rutin, és csak ebben van hibakövető utasítás; ekkor az A rutin →B rutin →C rutin hívási lánc esetén a C rutinban előforduló futási hiba hatására a vezérlést először az A rutinban levő hibaelemző kapja meg, majd a Resume, illetve ResumeNext utasítás hatására a B rutinnak a C-t hívó, illetve az azt követő utasítására kerül. Pénzügyi feladatok VBA támogatása – 9. előadás 15 /41
Rendszerhibakódok elemzése A futási hiba kódját az Err, szövegét az Error, a hibás sorban vagy azt megelőzően a rutinban bárhol álló szám-címke értékét pedig az Erl függvénnyel lehet lekérdezni; ezek rendre Integer, Long, illetve String típusú értéket adnak vissza. Pénzügyi feladatok VBA támogatása – 9. előadás 16 /41
Rendszerhibakódok elemzése A hibaelemző blokkban a hiba természetéről például az MsgBox "Az " & Erl & " címkét követően az "&Err & " kódú hiba volt: "_ & Error(Err),‚ "Hibaüzenet" üzenettel adhatunk teljes körű tájékoztatást a képernyőn. (Ebben az esetben csak az OK gomb látszik, a felhasználó nem tehet egyebet, mint hogy tudomásul veszi az üzenetet. Ha választ is várunk, az MsgBox függvényt kell alkalmaznunk.) Pénzügyi feladatok VBA támogatása – 9. előadás 17 /41
Rendszerhibakódok elemzése A hibakódok értékének az [1 ÷ 65535] intervallumba kell esnie. A beépített hibakódok értéke nem haladja meg a 32 767-et, ám a kódsorozat korántsem folytonos. A számunkra leginkább fontos VBA hibakódokat a következő táblázatban foglaltuk össze. A teljes lista a VB-nézet súgójában található meg. Pénzügyi feladatok VBA támogatása – 9. előadás 18 /41
Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás 19 /41
Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás 20 /41
Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás 21 /41
Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás 22 /41
Rendszerhibakódok elemzése A teljes lista a VB-nézet súgójában található meg. Eléréséhez s Súgó indexében keressünk rá a Trappable errors szövegre. A lista magyar nyelven nem hozzáférhető. Pénzügyi feladatok VBA támogatása – 9. előadás 23 /41
Rendszerhibakódok elemzése Ha az Err vagy az Error függyényt eljárásként aktiváljuk, megyáltozik a hatása: 1. Az Err = hibakód utasítással egyes rutinokban tetszőleges (célszerűen saját) hibakódot állíthatunk be. Ezt követően a hibakód elemzésével el tudjuk dönteni, hogy melyik rutinunkban keletkezett a hibajelzés. A beépített hibakódok értékéről mondottak értelmében, saját hibakódjaink számozását a biztonság okáért 32 768-tól kell kezdenünk. Pénzügyi feladatok VBA támogatása – 9. előadás 24 /41
Rendszerhibakódok elemzése 2. Érdekes fogás, hogy az Error(Err) utasítással szimulálni lehet az Err kódú hibát. Hatására a VBA Úgy viselkedik, mintha a hiba ténylegesen bekövetkezett volna: generálja az Err kódnak megfelelő hibajelzést, amelyet egy szabályos hibaelemzővel fel tudunk dolgozni. Pénzügyi feladatok VBA támogatása – 9. előadás 25 /41
Rendszerhibakódok elemzése Ha munkalapon kívánunk hibajelzést kiírni, Excel hibakódokat kell használnunk. Az áttekinthetőségi követelmény értelmében, célszerű ezeket számkód helyett Excel konstansokkal megadni. A lehetséges értékeket a következő táblázat tartalmazza. A kódokat kiírás előtt hibaértékké kell alakítani, a cvErr függvénnyel. Például a Cells(2,3).Value = CVErr(xlErrDiv0) utasítás „osztás nullával” hibajelzést jelenít meg az aktív munkalap C3 cellájában. Pénzügyi feladatok VBA támogatása – 9. előadás 26 /41
Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás 27 /41
Rendszerhibakódok elemzése A kódokat kiírás előtt hibaértékké kell alakítani, a cvErr függvénnyel. Például a Cells(2,3).Value = CVErr(xlErrDiv0) utasítás „osztás nullával” hibajelzést jelenít meg az aktív munkalap C2 cellájában. Pénzügyi feladatok VBA támogatása – 9. előadás 28 /41
Egyéni hibakódok alkalmazása A programozók szeretnének olyan programot írni, amelyet nem lehet hibás vagy téves adatmegadással „kiakasztani”. A VBA azzal támogatja ezt, hogy megengedi saját hibakódok létrehozását. Saját hibakódjainkat rutinjainkból felismerhetjük anélkül, hogy a rendszer futási hibát észlelne. Pénzügyi feladatok VBA támogatása – 9. előadás 29 /41
Egyéni hibakódok alkalmazása Mint említettük, hibaértéket csak Variant típusú változóban lehet létrehozni, a változónév = CVErr(hibakód) szintaxis szerint; ha pedig egy hibaértéket tartalmazó változót vizsgálunk, akkor IsError(változónév) = True választ kapjuk. Pénzügyi feladatok VBA támogatása – 9. előadás 30 /41
Egyéni hibakódok alkalmazása Saját hibakódjainkat célszerű a kódtartomány felső végétől (65 535) visszafelé választani, így biztosan elkerülhetjük az ütközést a rendszerhibák (későbbiekben esetleg bővülő) kódjával. Ügyelnünk kell azonban arra, hogy munkalapon csak Excel-hibajelzéseket helyezzünk el, különben hibás tulajdonságra utaló (380 kódú) rendszerhiba lép fel. Pénzügyi feladatok VBA támogatása – 9. előadás 31 /41
Fejlettebb technikák Programjaink áttekinthetőségét nagyban javítja, ha numerikus hibakódok helyett kitalálunk jellemző konstansneveket. Ügyesen átgondolt saját hibakód-készlettel elkerülhetjük, hogy rutinjaink futási hiba miatt elakadjanak. Tovább javítja az olvashatóságot, ha hibaellenőrzésre csak egyetlen (vagy egy-két) függvényt használunk, s ezeket hívjuk meg a rutinok hibaelemző blokkjából. Pénzügyi feladatok VBA támogatása – 9. előadás 32 /41
Fejlettebb technikák A hibakövető utasítás csak addig aktív, amíg az őt tartalmazó rutin az, tehát minden olyan rutinban ki kell írnunk, ahol hiba előfordulására számítunk. Pénzügyi feladatok VBA támogatása – 9. előadás 33 /41
Fejlettebb technikák Ha a hibák csak egy meghatározott rutinban fordulhatnak elő - például az állománykezelési hibák a lemezes adat-állományainkat megnyitó, író-olvasó, lezáró rutinban -‚ akkor a hibakezelést célszerű beépíteni az eljárásba. Az ilyen rutin az On Error Resume Next hibakövető utasítással indul. Pénzügyi feladatok VBA támogatása – 9. előadás 34 /41
Fejlettebb technikák Ez kétélű fegyver, mert így a rutin végrehajtása a hibát okozó utasítás után folytatódik, mintha mi sem történt volna. Ezért minden olyan sor után, amely hibát eredményezhet, If Err <> O Then vizsgálatnak kell következnie, különben a hiba észrevétlen marad. Pénzügyi feladatok VBA támogatása – 9. előadás 35 /41
Fejlettebb technikák Amikor már biztos (?)‚ hogy rutinjaink hibátlanok, kiiktathatjuk a nemkívánatos figyelmeztető rendszerüzeneteket az Application.DisplayAlerts = False utasítással. Hatására például a munkalapok figyelmeztetés nélkül törlődnek, az állományo mentésre vonatkozó kérdés nélkül záródnak be stb. Pénzügyi feladatok VBA támogatása – 9. előadás 36 /41
Fejlettebb technikák Ennek az a magyarázata, hogy a VBA ilyenkor az alapértelmezésnek megfelelő „Igen” választ tekinti érvényesnek. Érzékelhető a veszélyes helyzet? A figyelmeztetéseket az Application.DisplayAlerts = True utasítással lehet visszakapcsolni. Pénzügyi feladatok VBA támogatása – 9. előadás 37 /41
Még fejlettebb technikák A kézi megszakítás (Esc vagy CTRL + BREAK) igen hasznos találmány, ha sikerült összehoznunk egy végtelen ciklust. Sajnos azonban ezt a beavatkozást a felhasználó is elkövetheti — akár véletlenül, akár szándékosan. Murphy szerint, ha egy programot el Lehet rontani, akkor el is fogják rontani. Ez különösen akkor kellemetlen, ha emiatt elmaradnak műveletek, például nem záródnak le tisztességesen a megnyitott adatállományok; hálózatos üzemben elmarad a kijelentkezés; stb. Pénzügyi feladatok VBA támogatása – 9. előadás 38 /41
Még fejlettebb technikák Ha nem szeretnénk ilyen bonyodalmakba keveredni, megváltoztathatjuk a rendszer alapértelmezését az Application.EnableCancelKey = xlErrorHandler utasítással. Ennek az lesz a következménye, hogy minden kézi megszakításkor 18-as kódú futási hiba keletkezik, amit kezelni tudunk saját hibaelemzőnkkel. Legegyszerűbben úgy lehet eljárni, hogy ilyen esetekben választ kérünk a felhasználótól a folytatásra vonatkozóan. Pénzügyi feladatok VBA támogatása – 9. előadás 39 /41
Még fejlettebb technikák Elképzelhető, hogy ekkor valamilyen adatmódosításra, vagy egyéb felhasználói beavatkozásra lesz szükség. Az is lehetséges, hogy a felhasználó valamilyen okból tényleg be akarja fejezni a program futtatását; akkor tegyük ezt meg szabályszerűen. A kézi megszakítást az Application.EnableCancelKey = xlInterrupt utasítással kell újra engedélyezni (ezt programindításkor a VBA mindig automatikusan megteszi). Pénzügyi feladatok VBA támogatása – 9. előadás 40 /41
Még fejlettebb technikák A legveszélyesebb utasítás szintaxisa: Application.EnableCancelKey = xlDisabled Ezzel teljesen kiiktatunk mindennemű kézi megszakítási lehetőséget. Bánjunk ezzel nagyon óvatosan! Ha ezt követően egy rutin - legvalószínűbben egy Resume utasítás hatására folytonosan ismétlődő hiba miatt - netán végtelen ciklusba kerül, vagy bármilyen más okból még véges életünk folyamán szeretnénk leállítani a futását, csak a RESET gombban bízhatunk. Pénzügyi feladatok VBA támogatása – 9. előadás 41 /41 41 /41
Köszönöm a figyelmet! Folyt köv. Pénzügyi feladatok VBA támogatása – 9. előadás 42 /41