VBA - típus nem egyezik (futásidejű hiba 13)

Mi az a típushiba?

A VBA -kód futtatásakor gyakran előfordulhat eltérés. A hiba leállítja a kód teljes futtatását, és egy üzenetmező segítségével jelzi, hogy ezt a hibát ki kell küszöbölni

Ne feledje, hogy ha még nem tesztelte teljesen a kódot a felhasználóknak való elosztás előtt, akkor ez a hibaüzenet a felhasználók számára látható lesz, és nagy bizalomvesztést okoz az Excel -alkalmazásban. Sajnos a felhasználók gyakran nagyon különleges dolgokat művelnek egy alkalmazással, és gyakran olyan dolgokra gondolnak, amelyeket fejlesztőként soha nem gondoltál.

Típus -eltérés hiba lép fel, mert a Dim utasítást egy bizonyos típusként definiáltad, pl. egész szám, dátum, és a kódja olyan értéket próbál hozzárendelni a változóhoz, amely nem elfogadható, pl. szöveges karakterlánc egy egész változóhoz rendelve, mint ebben a példában:

Íme egy példa:

Kattintson a Hibakeresés gombra, és a szabálysértő kódsor sárgával lesz kiemelve. A hiba felugró ablakban nincs lehetőség a folytatásra, mivel ez súlyos hiba, és a kód nem futtatható tovább.

Ebben a konkrét esetben a megoldás az, ha a Dim utasítást olyan változótípusra változtatja, amely megegyezik a változóhoz rendelt értékkel. A kód akkor működik, ha a változó típusát „String” értékre változtatja, és valószínűleg a változó nevét is meg szeretné változtatni.

A változó típusának megváltoztatásához azonban vissza kell állítania a projektet, és újra kell futtatnia a kódot az elejétől, ami nagyon bosszantó lehet, ha hosszú eljárásról van szó

Hiba a munkalap kiszámításakor

A fenti példa egy nagyon egyszerű példa arra, hogyan lehet előállítani egy eltérést, és ebben az esetben könnyen orvosolható

Az eltérési hibák oka azonban ennél jóval mélyebb, és nem annyira nyilvánvaló, ha a kód hibakeresését próbálja meg.

Tegyük fel például, hogy írt egy kódot, hogy felvegyen egy értéket a munkalap egy bizonyos pozíciójában, és ez tartalmaz egy számítástól függő többi cellát a munkafüzetben (B1 ebben a példában)

A munkalap így néz ki, mint ez a példa, egy képlettel, amellyel egy adott karaktert találhat a szövegsoron belül

A felhasználó szempontjából az A1 cella szabad formátumú, és tetszőleges értéket megadhat. A képlet azonban a „B” karakter előfordulását keresi, és ebben az esetben nem található, így a B1 cella hibaértékkel rendelkezik.

Az alábbi tesztkód nem egyeztetési hibát fog okozni, mert rossz értéket adott meg az A1 cellába

1234 Sub TestMismatch ()Saját szám, mint egészMyNumber = Sheets ("Sheet1"). Tartomány ("B1"). ÉrtékEnd Sub

A B1 cella értéke hibát okozott, mert a felhasználó olyan szöveget írt be az A1 cellába, amely nem felel meg a vártnak, és nem tartalmazza a „B” karaktert

A kód megpróbálja hozzárendelni az értéket a „MyNumber” változóhoz, amelyet úgy határoztak meg, hogy egész számot várjon el, és így nem egyezési hibát kap.

Ez egyike azoknak a példáknak, ahol a kód aprólékos ellenőrzése nem ad választ. Azt is meg kell néznie a munkalapon, ahonnan az érték származik, hogy megtudja, miért történik ez.

A probléma valójában a munkalapon van, és a B1 képletét módosítani kell, hogy a hibaértékek kezelhetők legyenek. Ezt megteheti az „IFERROR” képlet használatával, ha alapértelmezett 0 értéket ad meg, ha a keresési karakter nem található

Ezután beilleszthet kódot, hogy ellenőrizze a nulla értéket, és figyelmeztető üzenetet jelenítsen meg a felhasználónak, hogy az A1 cella értéke érvénytelen

12345678 Sub TestMismatch ()Saját szám, mint egészSaját szám = Táblázatok ("Lap1"). Tartomány ("B1"). SzövegHa MyNumber = 0 AkkorMsgBox "Az A1 cella értéke érvénytelen", vbCriticalKilépés a SubbólVége HaEnd Sub

Az adatellenőrzést (a szalag Adatok lapján található Adateszközök csoportot) is használhatja a táblázatban, hogy megakadályozza, hogy a felhasználó azt tegyen, amit szeret, és először is a munkalap hibáit okozza. Csak olyan értékeket adjon meg nekik, amelyek nem okoznak munkalaphibákat.

Írhat VBA -kódot a Munkalap esemény módosítása alapján, hogy ellenőrizze a bevitt adatokat.

A zárolás és a jelszó védi a munkalapot is, így az érvénytelen adatok nem vihetők be

Nem megfelelő hiba a megadott cellaértékek miatt

Eltérési hibákat okozhat a kódban, ha normál értékeket hoz be egy munkalapról (nem hiba), de ahol a felhasználó váratlan értéket adott meg, pl. szöveges érték, amikor számot várt. Előfordulhat, hogy úgy döntöttek, hogy egy sort egy számtartományba illesztenek be, hogy megjegyzést tegyenek egy cellába, amely elmagyaráz valamit a számról. Végtére is, a felhasználónak fogalma sincs, hogyan működik a kódja, és hogy a jegyzetük beírásával csak kidobták az egészet.

Az alábbi példakód egy egyszerű tömböt hoz létre, amelyet „MyNumber” -nek neveznek, egész számokkal definiálva

A kód ezután ismétlődik az A1 -től A7 -ig terjedő cellatartományban, hozzárendelve a cellaértékeket a tömbhöz, a „Coun” változó segítségével minden értéket indexelve

Amikor a kód eléri a szövegértéket, ez eltérést okoz, és minden leáll

Ha a hiba előugró ablakában a „Hibakeresés” gombra kattint, látni fogja a kódot, amelyen a probléma sárgával van kiemelve. Ha a kurzort a kódon belül a „Coun” változó bármely példányára helyezi, látni fogja a „Coun” értékét, ha a kód meghibásodott, ami ebben az esetben 5

A munkalapot nézve látni fogja, hogy az 5th cellának lefelé szöveges értéke van, és ez a kód meghibásodását okozta

A kódot úgy módosíthatja, hogy feltételt ad, amely először ellenőrzi a numerikus értéket, mielőtt hozzáadja a cellaértéket a tömbhöz

12345678910111213 Sub TestMismatch ()Dim Saját szám (10) Egész számként, Coun egészkéntCoun = 1TeddHa Coun = 11, akkor lépjen kiHa IsNumeric (Sheets ("sheet1"). Cellák (Coun, 1). Value) AkkorMyNumber (Coun) = Sheets ("sheet1"). Cellák (Coun, 1). ÉrtékMásSaját szám (Coun) = 0Vége HaCoun = Coun + 1HurokEnd Sub

A kód az „IsNumeric” függvényt használja annak ellenőrzésére, hogy az érték valóban szám -e, és ha igen, akkor beírja a tömbbe. Ha nem szám, akkor nulla értéket ad meg.

Ez biztosítja, hogy a tömbindex összhangban legyen a táblázat cella sorszámaival.

A „Hibák” munkalaphoz hozzáadhat olyan kódot is, amely az eredeti hibaértéket és a hely részleteit másolja, hogy a felhasználó láthassa, mit hibázott a kód futtatásakor.

A numerikus teszt a cella teljes kódját, valamint a kódot használja az érték hozzárendeléséhez a tömbhöz. Vitatkozhat azzal, hogy ezt egy változóhoz kell hozzárendelni, hogy ne ismételje meg ugyanazt a kódot, de a probléma az, hogy a változót „Variant” -ként kell definiálnia, ami nem a legjobb dolog.

Szüksége van továbbá adatellenőrzésre a munkalapon és a munkalap jelszavas védelméhez. Ez megakadályozza, hogy a felhasználó sorokat szúrjon be, és váratlan adatokat adjon meg.

Nem megfelelő hiba, amelyet egy funkció vagy szubrutin meghívása okoz a paraméterek használatával

Funkció hívásakor általában paramétereket ad át a függvénynek a függvény által már meghatározott adattípusok használatával. A függvény lehet a VBA -ban már definiált, vagy lehet egy felhasználó által definiált funkció, amelyet saját maga készített. Az alrutin néha paramétereket is igényelhet

Ha nem tartja be a paraméterek függvénybe történő átvitelének szabályait, akkor nem egyezési hibát kap

12345678 Hívás alfunkció ()Dim Ret mint egészRet = MyFunction (3, "teszt")End SubFunkció MyFunction (N mint egész, T mint karakterlánc) karakterlánckéntSajátFunkció = T.Vége funkció

Itt több lehetőség is kínálkozik az eltérési hiba megjelenítésére

A visszatérési változó (Ret) egész számként van definiálva, de a függvény karakterláncot ad vissza. Amint futtatja a kódot, meghiúsul, mert a függvény karakterláncot ad vissza, és ez nem mehet be egy egész változóba. Érdekes módon a hibakeresés ezen a kódon történő futtatása nem veszi fel ezt a hibát.

Ha idézőjeleket helyez az első átadandó paraméter köré (3), akkor azt karakterláncként értelmezi, amely nem egyezik a függvény első paraméterének definíciójával (egész)

Ha a függvényhívás második paraméterét numerikus értékre állítja be, az nem fog megfelelni, mert a karakterlánc második paramétere karakterláncként (szöveg) van definiálva

Nem megfelelő hiba, amelyet a VBA konverziós funkcióinak hibás használata okoz

Számos konverziós funkció használható a VBA -ban az értékek különböző adattípusokká alakításához. Példa erre a „CInt”, amely egy számot tartalmazó karakterláncot egész értékűvé alakít.

Ha a konvertálandó karakterlánc bármilyen alfa karaktert tartalmaz, akkor nem egyezési hibát kap, még akkor is, ha a karakterlánc első része numerikus karaktereket tartalmaz, a többi pedig alfa karaktereket, pl. "123abc"

Az eltérési hibák általános megelőzése

Láttuk a fenti példákban, hogy a kódon belül hogyan lehet kezelni az esetleges eltéréseket, de számos más módszer is létezik, bár ezek nem a legjobb lehetőségek:

Változótípusként határozza meg a változókat

Egy variáns típus az alapértelmezett változótípus a VBA -ban. Ha nem használ Dim utasítást egy változóhoz, és egyszerűen elkezdi használni a kódban, akkor automatikusan megadja a Variant típusát.

A Változó változó bármilyen típusú adatot elfogad, legyen szó egész számról, hosszú egész számról, kettős pontosságú számról, logikai értékről vagy szöveges értékről. Ez csodálatos ötletnek hangzik, és kíváncsi vagy, miért nem mindenki állítja be minden változóját variánsra.

A változat adattípusának azonban számos hátránya van. Először is, sokkal több memóriát foglal el, mint más adattípusok. Ha egy nagyon nagy tömböt határoz meg változatként, az hatalmas memóriát emészt fel, amikor a VBA -kód fut, és könnyen teljesítményproblémákat okozhat

Másodszor, általában lassabb a teljesítménye, mint ha bizonyos adattípusokat használ. Például, ha bonyolult számításokat végez lebegő tizedesjegyű számokkal, a számítások lényegesen lassabbak lesznek, ha a számokat változatként tárolja, nem pedig kettős pontosságú számokat

A variáns típus használata hanyag programozásnak minősül, hacsak nem feltétlenül szükséges.

Használja az OnError parancsot a hibák kezelésére

Az OnError parancs beilleszthető a kódba, hogy kezelje a hibaelhárítást, így ha valaha hiba történik, a felhasználó értelmes üzenetet lát a standard VBA hibaüzenet helyett

1234567 Alhiba csapda ()Saját szám, mint egészHiba esetén GoTo Err_HandlerSaját szám = "teszt"Err_Handler:MsgBox "A hiba" & Err.Description & "történt"End Sub

Ez hatékonyan megakadályozza, hogy a hiba megállítsa a kód zökkenőmentes működését, és lehetővé teszi a felhasználó számára, hogy tisztán helyreálljon a hibahelyzetből.

Az Err_Handler rutin további információkat jeleníthet meg a hibáról és arról, hogy kihez forduljon.

Programozási szempontból, ha hibakezelési rutinot használ, meglehetősen nehéz megtalálni a hibasor kódját. Ha az F8 billentyűvel lépteti át a kódot, akkor amint a szabálysértő kódsor lefut, a hibakezelési rutinra ugrik, és nem tudja ellenőrizni, hogy hol hibázik.

Ennek elkerülése érdekében állítson be egy igaz vagy hamis (Boolean) globális konstansot, és ezzel kapcsolja be vagy ki a hibakezelési rutinot az „If” utasítás használatával. Ha tesztelni szeretné a hibát, mindössze annyit kell tennie, hogy a globális állandót False értékre állítja, és a hibakezelő többé nem fog működni.

1 Globális Const ErrHandling = Hamis
1234567 Alhiba csapda ()Saját szám, mint egészHa ErrHandling = Igaz, akkor hiba esetén GoTo Err_HandlerSaját szám = "teszt"Err_Handler:MsgBox "A hiba" & Err.Description & "történt"End Sub

Az egyetlen probléma ezzel az, hogy lehetővé teszi a felhasználó számára, hogy helyreálljon a hibából, de az alrutinon belüli kód többi része nem fut, ami óriási következményekkel járhat később az alkalmazásban

A cellatartományon keresztül történő ciklus korábbi példáját használva a kód az A5 cellába kerül, és eltalálja a hibás hibát. A felhasználó látna egy üzenetdobozt, amely információkat tartalmaz a hibáról, de a tartományban lévő cellától kezdve semmi sem kerül feldolgozásra.

Használja az OnError parancsot a hibák elnyomására

Ez az „On Error Resume Next” parancsot használja. Ezt nagyon veszélyes a kódba foglalni, mivel megakadályozza a későbbi hibák megjelenítését. Ez alapvetően azt jelenti, hogy a kód végrehajtása közben, ha hiba lép fel a kódsorban, a végrehajtás csak a következő sorra lép, anélkül, hogy végrehajtaná a hibasort, és folytatja a szokásos módon.

Ez megoldhatja a potenciális hibahelyzetet, de továbbra is hatással lesz a kód minden későbbi hibájára. Ekkor azt gondolhatja, hogy kódja hibamentes, de valójában nem az, és a kód egyes részei nem azt teszik, amit Ön szerint tennie kell.

Vannak olyan helyzetek, amikor szükséges használni ezt a parancsot, például ha a fájlt a "Kill" paranccsal törli (ha a fájl nincs jelen, akkor hiba lép fel), de a hibakeresést mindig vissza kell kapcsolni azonnal bekapcsol, miután a lehetséges hiba előfordulhat a következők használatával:

1 Hiba: Goto 0

A cellatartományon keresztül történő hurkolás korábbi példájában, az 'On Error Resume Next' használatával, ez lehetővé tenné a ciklus folytatását, de a hibát okozó cella nem kerül át a tömbbe, és az adott index tömb eleme null értéket tartana.

Az adatok konvertálása adattípusra a nyilatkozatnak megfelelően

A VBA függvények segítségével módosíthatja a bejövő adatok adattípusát, hogy megfeleljen a fogadó változó adattípusának.

Ezt megteheti, amikor paramétereket ad át a függvényeknek. Például, ha van egy szám, amelyet egy karakterlánc -változó tárol, és szeretné számként átadni egy függvénynek, használhatja a CInt

Számos ilyen átalakítási funkció használható, de itt vannak a legfontosabbak:

CInt - egy numerikus értékű ( + vagy - 32 768 alatti) karakterláncot egész értékűvé alakít át. Ne feledje, hogy ez lecsökkenti a tizedespontokat

CLng - A nagy számértékű karakterláncot hosszú egész számmá alakítja át. A tizedespontok le vannak vágva.

CDbl - Egy lebegő tizedesjegy számot tartalmazó karakterláncot dupla pontosságú számmá alakít át. Tizedesjegyeket tartalmaz

CDate - A dátumot tartalmazó karakterláncot dátumváltozóvá alakítja. Részben a Windows Vezérlőpult beállításaitól és a dátum értelmezésének helyétől függ

CStr - Egy numerikus vagy dátumértéket karakterlánccá alakít át

Amikor karakterláncból számra vagy dátumra konvertál, a karakterlánc nem tartalmazhat más számokat vagy dátumot. Ha alfa karakterek vannak jelen, ez nem egyezési hibát okoz. Íme egy példa, amely eltérési hibát okoz:

123 Rész teszt ()MsgBox CInt ("123abc")End Sub

Változók tesztelése a kódon belül

A változó tesztelésével megtudhatja, hogy milyen adattípusról van szó, mielőtt hozzárendeli egy adott típusú változóhoz.

Például ellenőrizheti, hogy a karakterlánc numerikus -e a VBA „IsNumeric” függvényével

1 MsgBox IsNumeric ("123test")

Ez a kód hamis értéket ad vissza, mert bár a karakterlánc numerikus karakterekkel kezdődik, szöveget is tartalmaz, így megbukik a teszten.

1 MsgBox IsNumeric ("123")

Ez a kód igaz értéket ad vissza, mert mind numerikus karakterekből áll

A VBA -ban számos olyan funkció található, amelyekkel különféle adattípusokat lehet tesztelni, de ezek a legfontosabbak:

IsNumeric - teszteli, hogy egy kifejezés szám -e vagy sem

IsDate - teszteli, hogy egy kifejezés dátum -e vagy sem

IsNull - teszteli, hogy egy kifejezés null -e vagy sem. Null érték csak egy objektumba helyezhető el, különben az „Invalid Use of Null” hibaüzenetet kapja. Az üzenetdoboz null értéket ad vissza, ha azt kérdezi, ezért a visszatérési változónak egy változatnak kell lennie. Ne feledje, hogy minden null értéket használó számítás mindig a null eredményét adja vissza.

IsArray - teszteli, hogy a kifejezés tömböt képvisel -e vagy sem

IsEmpty - teszteli, hogy a kifejezés üres -e vagy sem. Vegye figyelembe, hogy az üres nem azonos a null értékkel. A változó üres, amikor először definiálja, de nem null érték

Meglepő módon nincs funkció az IsText vagy az IsString számára, ami igazán hasznos lenne

Objektumok és eltérési hibák

Ha objektumokat, például tartományt vagy munkalapot használ, akkor nem a futási időben, hanem a fordítási időben kap eltérési hibát, ami kellő figyelmeztetést ad arra, hogy a kód nem fog működni

123456 Sub TestRange ()Dim MyRange As Range, I As LongMyRange = tartomány beállítása ("A1: A2")I = 10x = UseMyRange (I)End Sub
12 Funkció használata: MyRange (R mint tartomány)Vége funkció

Ennek a kódnak van egy „UseMyRange” nevű függvénye és egy paraméter, amelyet tartományobjektumként adtak át. Az átadandó paraméter azonban egy hosszú egész szám, amely nem egyezik az adattípussal.

Amikor futtatja a VBA -kódot, azt azonnal lefordítja, és ezt a hibaüzenetet fogja látni:

A szabálysértő paraméter kék háttérrel lesz kiemelve

Általánosságban elmondható, hogy ha hibákat követ el a VBA -kódban az objektumok használatával, akkor ezt a hibaüzenetet fogja látni, nem pedig a típusazonosító üzenetet:

Segít a fejlesztés a helyszínen, megosztva az oldalt a barátaiddal

wave wave wave wave wave