Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Barna Róbert KE GTK Informatika Tanszék Pénzügyi feladatok VBA támogatása 9. előadás.

Hasonló előadás


Az előadások a következő témára: "Barna Róbert KE GTK Informatika Tanszék Pénzügyi feladatok VBA támogatása 9. előadás."— Előadás másolata:

1

2 Barna Róbert KE GTK Informatika Tanszék Pénzügyi feladatok VBA támogatása 9. előadás

3 Barna Róbert KE GTK Informatika Tanszék Pénzügyi feladatok VBA támogatása 9. előadás

4 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ás4 /41

5 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ás5 /41

6 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ás6 /41

7 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ás7 /41

8 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ás8 /41

9 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ás9 /41

10 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ás10 /41

11 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ás11 /41

12 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ás12 /41

13 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ás13 /41

14 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ás14 /41

15 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 Resume Next 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ás15 /41

16 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ás16 /41

17 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ás17 /41

18 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 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ás18 /41

19 Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás KódHibaüzenetValószínű hibaokok 5Invalid procedure callA formális és az aktuális paraméterek típusa nem egyezik 6OverflowTípus értékhatárainak túllépése értékadás, számolás stb. során 9Subscript out of rangeHivatkozás konténer nem létező elemére (indexhatár túllépés) 1Division by zeroOsztási kísérlet nullával 13Type mismatchAdatkonverziós kísérlet nem illeszthető típusok között 18User interrupt occurredKézi megszakítás a hibakezelő kikapcsolt állapotában 20Resume without errorResume utasítás végrehajtási kísérlete hiba előfordulása nélkül 19 /41

20 Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás KódHibaüzenetValószínű hibaokok 28Out of stack spaceVerem túlcsordulás (túl sok egymásba ágyazott rutinhívás!) 35Sub ot Function not defined Hivatkozás nem létező vagy nem elérhető (például Private) rutinra 52Bad filename or numberHibás állománynév; hivatkozás nem nyitott állományra 53File not foundHivatkozás nem létező állományra 54Bad lile modeIrási kísérlet olvasásra megnyitott állományra stb. 55F’ile already openKísérlet ismételt megnyitásra vagy nyitott állomány törlésére 57Device I/O errorNyomtató vagy lemezmeghajtó hiba 58File already existsMár létező állománynév mentés másként eljárásban stb. 20 /41

21 Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás KódHibaüzenetValószínű hibaokok 61Disk fullBetelt a lemez 62Input past end of fileOlvasási kísérlet az állomány végén 68Device unavailableA külső eszköz nincs vonali kapcsolatban a számítógéppel 70Permission deniedÍrási kísérlet védett vagy zárolt állományra 71Disk not readyNem létező vagy üres lemezmeghajtú 76Path not foundÁllomány útvonala nem megfelelő 380Invalid property valueÉrvénytelen tulajdonságérték 424Object requiredMetódus/tulajdonság aktiválása, érvényes objektum-hivatkozás nélkül 21 /41

22 Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás KódHibaüzenetValószínű hibaokok 438Object doesnt support this Az objektumnak nincs ilyen tulajdonsága vagy metódusa property or method 449Argument not optionalHiányzó aktuális paraméter 450Wrong number of arguments A formális és az aktuális paraméterlista nem egyezik 482Printer errorNyomtató hiba 485Invalid picture typeErvénytelen képfájlformátum 1004No objectA hivatkozott objektum (például munkalap) nem létezik 22 /41

23 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ás23 /41

24 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 tól kell kezdenünk. Pénzügyi feladatok VBA támogatása – 9. előadás24 /41

25 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ás25 /41

26 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ás26 /41

27 Rendszerhibakódok elemzése Pénzügyi feladatok VBA támogatása – 9. előadás Kód Excel konstans Hibaüzenet Jelentés magyarulangolul 2000xlErrNull#NULLA!#NULL! Hivatkozás diszjunkt tartományok metszetére 2007xlErrDiv0#ZÉRÓOSZTÓ!#DIV/0!Osztás nullával 2015xlErrMilue#ÉRTÉK!#VALUE! Nem illeszthető (inkompatíbilis) típusú argumentumok vagy tényezők 2023xlErrRef#HIV!#REF! Hivatkozás nem létező objektumra 2029xtErrName#NÉV!#NAME? Ismeretlen rutin- vagy argumentum-név 2036xtErrNum#SZÁM!#NUM!Hibás számformátum 2042xlErrNA#HIÁNYZIK!#NA Hivatkozás üres cellára/tartományra („nincs adat”) 27 /41

28 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ás28 /41

29 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ás29 /41

30 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ás30 /41

31 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ás31 /41

32 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ás32 /41

33 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ás33 /41

34 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ás34 /41

35 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ás35 /41

36 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ás36 /41

37 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ás37 /41

38 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ás38 /41

39 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ás39 /41

40 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ás40 /41

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ás41 /41

42 Köszönöm a figyelmet! Folyt köv. Pénzügyi feladatok VBA támogatása – 9. előadás42 /41


Letölteni ppt "Barna Róbert KE GTK Informatika Tanszék Pénzügyi feladatok VBA támogatása 9. előadás."

Hasonló előadás


Google Hirdetések