VBA - Neujemanje vrste (napaka med izvajanjem 13)

Kaj je napaka pri neusklajenosti vrst?

Napaka neusklajenosti se lahko pogosto pojavi, ko zaženete kodo VBA. Napaka bo ustavila delovanje vaše kode in označila polje s sporočilom, ki ga je treba razvrstiti

Upoštevajte, da če kode niste popolnoma preizkusili pred distribucijo uporabnikom, bo to sporočilo o napaki uporabnikom vidno in bo povzročilo veliko izgubo zaupanja v vašo aplikacijo Excel. Na žalost uporabniki pogosto počnejo zelo nenavadne stvari v aplikaciji in pogosto kot stvari, ki jih kot razvijalec nikoli niste upoštevali.

Napaka pri neusklajenosti tipa se pojavi, ker ste spremenljivko z izjavo Dim definirali kot določeno vrsto, npr. celo število, datum in vaša koda poskuša spremenljivki dodeliti vrednost, ki ni sprejemljiva, npr. besedilni niz, dodeljen celoštevilski spremenljivki, kot je v tem primeru:

Tukaj je primer:

Kliknite Debug in napačna vrstica kode bo označena z rumeno. V pojavnem oknu za napako ni možnosti za nadaljevanje, saj je to velika napaka in koda ne more nadaljevati.

V tem konkretnem primeru je rešitev spremeniti stavek Dim v spremenljivko, ki deluje z vrednostjo, ki jo dodelite spremenljivki. Koda bo delovala, če spremenite vrsto spremenljivke v "Niz", verjetno pa bi želeli spremeniti tudi ime spremenljivke.

Če pa želite spremeniti vrsto spremenljivke, boste morali projekt ponastaviti in kodo boste morali znova zagnati takoj na začetku, kar je lahko zelo nadležno, če gre za dolg postopek

Napaka neskladja, ki jo povzroči izračun delovnega lista

Zgornji primer je zelo preprost, kako lahko pride do napake pri neusklajenosti in jo v tem primeru zlahka odpravimo

Vendar je vzrok za napake pri neusklajenosti običajno veliko globlji od tega in ni tako očiten, ko poskušate odpraviti napake v kodi.

Recimo, da ste na primer napisali kodo, da poberete vrednost na določenem mestu na delovnem listu in vsebuje druge celice, ki so odvisne od izračuna v delovnem zvezku (B1 v tem primeru)

Delovni list je videti kot ta primer s formulo za iskanje določenega znaka v nizu besedila

Z vidika uporabnika je celica A1 proste oblike in lahko vnese poljubno vrednost. Formula pa išče pojav znaka 'B' in v tem primeru ni najdena, zato ima celica B1 vrednost napake.

Spodnja preskusna koda bo povzročila napako pri neusklajenosti, ker je bila v celico A1 vnesena napačna vrednost

1234 Sub TestMismatch ()Zatemni MyNumber kot celo številoMyNumber = Listi ("List1"). Razpon ("B1"). VrednostEnd Sub

Vrednost v celici B1 je povzročila napako, ker je uporabnik v celico A1 vnesel besedilo, ki ni v skladu s pričakovanji in ne vsebuje znaka „B“

Koda poskuša dodeliti vrednost spremenljivki "MyNumber", ki je bila definirana tako, da pričakuje celo število, zato dobite napako pri neusklajenosti.

To je eden od teh primerov, kjer natančno preverjanje kode ne bo dalo odgovora. Prav tako morate pogledati na delovnem listu, od kod prihaja vrednost, da ugotovite, zakaj se to dogaja.

Težava je pravzaprav na delovnem listu, zato je treba formulo v B1 spremeniti, tako da bodo obravnavane vrednosti napak. To lahko storite tako, da s formulo „IFERROR“ podate privzeto vrednost 0, če iskalnega znaka ne najdete

Nato lahko vključite kodo, da preverite ničelno vrednost in prikažete opozorilo uporabniku, da je vrednost v celici A1 neveljavna

12345678 Sub TestMismatch ()Zatemni MyNumber kot celo številoMyNumber = Listi ("List1"). Obseg ("B1"). BesediloČe je MyNumber = 0, potemMsgBox "Vrednost v celici A1 je neveljavna", vbCriticalZapri podKonec ČeEnd Sub

Uporabite lahko tudi preverjanje podatkov (skupina Podatkovna orodja na zavihku Podatki na traku) v preglednici, da uporabniku preprečite, da bi delal vse, kar mu je všeč, in najprej povzroči napake na delovnem listu. Dovolite jim le vnos vrednosti, ki ne bodo povzročile napak na delovnem listu.

Kodo VBA lahko napišete na podlagi dogodka Sprememba na delovnem listu, da preverite, kaj je vneseno.

Zaklepanje in geslo ščitita tudi delovni list, tako da neveljavnih podatkov ni mogoče vnesti

Napaka pri neusklajevanju zaradi vnesenih vrednosti celic

Napake pri neusklajenosti lahko povzročijo v vaši kodi vnos normalnih vrednosti z delovnega lista (brez napak), če pa je uporabnik vnesel nepričakovano vrednost, npr. besedilno vrednost, ko ste pričakovali številko. Morda so se odločili, da v vrstico vnesejo vrstico, tako da lahko v celico vnesejo beležko, ki razlaga nekaj o številki. Konec koncev, uporabnik nima pojma, kako deluje vaša koda, in da so z vnosom zapiska pravkar zavrgli celotno stvar.

Spodnja koda ustvarja preprosto matriko, imenovano "MyNumber", definirano s celoštevilčnimi vrednostmi

Koda se nato ponavlja skozi obseg celic od A1 do A7 in dodeljuje vrednosti celic v matriko z uporabo spremenljivke "Coun" za indeksiranje vsake vrednosti

Ko koda doseže besedilno vrednost, pride do napake pri neusklajenosti in vse se ustavi

Če v pojavnem oknu napake kliknete »Odpravi napake«, boste videli vrstico kode, v kateri je težava označena z rumeno. Če postavite kazalec na kateri koli primerek spremenljivke "Coun" v kodi, boste lahko videli vrednost "Coun", kjer koda ni uspela, kar je v tem primeru 5

Če pogledate delovni list, boste videli, da je 5th celica navzdol ima besedilno vrednost, kar je povzročilo neuspeh kode

Kodo lahko spremenite tako, da pred dodajanjem vrednosti celice v matriko najprej vnesete pogoj, ki preveri številsko vrednost

12345678910111213 Sub TestMismatch ()Dim MyNumber (10) Kot celo število, štej kot celo številoŠtevec = 1NarediČe je Coun = 11, zapustite DoČe je številčno (listi ("list1"). Celice (števec, 1). Vrednost))MyNumber (Coun) = Sheets ("sheet1"). Cells (Coun, 1) .VrednostSicer paMyNumber (Coun) = 0Konec ČeCoun = Coun + 1ZankaEnd Sub

Koda uporablja funkcijo ‘IsNumeric’, da preveri, ali je vrednost dejansko številka, in če je, jo vnese v matriko. Če ni številka, potem vnese vrednost nič.

To zagotavlja, da je indeks matrike v skladu s številkami vrstic celic v preglednici.

Kodo, ki kopira izvirno vrednost napake in podrobnosti o lokaciji, lahko dodate tudi na delovni list "Napake", tako da lahko uporabnik vidi, kaj je naredil narobe, ko je vaša koda zagnana.

Številčni test uporablja celotno kodo celice in kodo za dodelitev vrednosti matriki. Lahko bi trdili, da je treba to dodeliti spremenljivki, da ne bi ponavljali iste kode, vendar je težava v tem, da bi morali spremenljivko opredeliti kot "različico", kar ni najboljše.

Potrebujete tudi preverjanje podatkov na delovnem listu in za zaščito delovnega lista z geslom. To bo uporabniku preprečilo vstavljanje vrstic in vnos nepričakovanih podatkov.

Napaka neusklajenosti, ki jo povzroči klic funkcije ali podprograma z uporabo parametrov

Ko je funkcija poklicana, običajno funkciji posredujete parametre z uporabo podatkovnih tipov, ki jih funkcija že definira. Funkcija je lahko ena, ki je že definirana v VBA, ali pa je uporabniško definirana funkcija, ki ste jo ustvarili sami. Podprogram lahko včasih zahteva tudi parametre

Če se ne držite konvencij o tem, kako se parametri posredujejo funkciji, boste dobili napako pri neusklajenosti

12345678 Sub CallFunction ()Dim Ret kot celo številoRet = MyFunction (3, "test")End SubFunkcija MyFunction (N kot celo število, T kot niz) kot nizMyFunction = T.Končana funkcija

Obstaja več možnosti, da pride do napake pri neusklajenosti

Vrnilna spremenljivka (Ret) je definirana kot celo število, vendar funkcija vrne niz. Takoj, ko zaženete kodo, ne bo uspela, ker funkcija vrne niz in ta ne more iti v celoštevilsko spremenljivko. Zanimivo je, da zagon Debug na tej kodi ne odpravi te napake.

Če okrog prvega podanega parametra (3) postavite narekovaje, se razlaga kot niz, ki se ne ujema z definicijo prvega parametra v funkciji (celo število)

Če drugi parameter v klicu funkcije spremenite v številsko vrednost, ne bo uspel z neusklajenostjo, ker je drugi parameter v nizu definiran kot niz (besedilo)

Napaka pri neusklajevanju, ki je posledica nepravilne uporabe funkcij pretvorbe v VBA

V VBA lahko uporabite številne pretvorbene funkcije za pretvorbo vrednosti v različne vrste podatkov. Primer je "CInt", ki niz, ki vsebuje številko, pretvori v celoštevilčno vrednost.

Če niz, ki ga želite pretvoriti, vsebuje alfa -znake, boste dobili napako pri neusklajenosti, tudi če prvi del niza vsebuje številske znake, preostali pa alfa -znake, npr. "123abc"

Splošno preprečevanje napak pri neskladju

V zgornjih primerih smo videli več načinov reševanja morebitnih napak pri neusklajenosti v vaši kodi, vendar obstajajo še drugi načini, čeprav morda niso najboljše možnosti:

Spremenljivke določite kot vrsto variante

Vrsta variante je privzeta vrsta spremenljivke v VBA. Če za spremenljivko ne uporabljate stavka Dim in ga preprosto začnete uporabljati v svoji kodi, potem samodejno dobi vrsto variante.

Spremenljivka Variant bo sprejela vse vrste podatkov, pa naj gre za celo število, dolgo celo število, število z dvojno natančnostjo, logično vrednost ali besedilno vrednost. To se sliši kot čudovita ideja in sprašujete se, zakaj vsi preprosto ne nastavijo vseh svojih spremenljivk na varianto.

Vendar ima različni podatkovni tip več pomanjkljivosti. Prvič, zavzame veliko več pomnilnika kot druge vrste podatkov. Če kot varianto določite zelo veliko matriko, bo požrla ogromno pomnilnika, ko se izvaja koda VBA, in lahko zlahka povzroči težave z zmogljivostjo

Drugič, delovanje je na splošno počasnejše, kot če uporabljate posebne vrste podatkov. Na primer, če izvajate zapletene izračune s številkami s plavajočo decimalno vejico, bodo izračuni precej počasnejši, če shranite številke kot različice in ne številk z dvojno natančnostjo.

Uporaba različice se šteje za neumno programiranje, razen če je to nujno potrebno.

Za odpravljanje napak uporabite ukaz OnError

Ukaz OnError je lahko vključen v vašo kodo za obravnavo ujemanja napak, tako da uporabnik, če pride do napake, vidi smiselno sporočilo namesto standardnega pojavnega okna napake VBA

1234567 Sub ErrorTrap ()Zatemni MyNumber kot celo številoPri napaki Pojdi na Err_HandlerMyNumber = "test"Err_Handler:MsgBox "Napaka" & Err.Opis & "je prišlo"End Sub

To učinkovito preprečuje, da bi napaka preprečila nemoteno delovanje vaše kode, in uporabniku omogoča, da se popolnoma opomore od situacije napake.

Rutina Err_Handler bi lahko pokazala dodatne informacije o napaki in na koga se obrniti glede tega.

S programskega vidika je pri uporabi rutine za odpravljanje napak precej težko najti vrstico kode, v kateri je napaka. Če s kodo F8 prestopate kodo, takoj po zagonu napačne vrstice kode preskoči na rutino za odpravljanje napak in ne morete preveriti, kje gre.

Pot do tega je, da nastavite globalno konstanto, ki je True ali False (Boolean) in s tem vklopite ali izklopite rutino za odpravljanje napak z uporabo stavka "If". Ko želite preizkusiti napako, morate le globalno konstanto nastaviti na False in upravljavec napak ne bo več deloval.

1 Global Const ErrHandling = Napačno
1234567 Sub ErrorTrap ()Zatemni MyNumber kot celo številoČe je ErrHandling = True, potem Napaka Pojdi na Err_HandlerMyNumber = "test"Err_Handler:MsgBox "Napaka" & Err.Opis & "je prišlo"End Sub

Edina težava pri tem je, da uporabniku omogoča, da si opomore od napake, vendar se preostala koda v podprogramu ne zažene, kar ima lahko kasneje velike posledice v aplikaciji

S prejšnjim primerom zanke skozi vrsto celic bi koda prišla v celico A5 in zadela napako, ki se ne ujema. Uporabnik bi videl polje s sporočilom, ki vsebuje informacije o napaki, vendar od te celice naprej v obsegu ne bi bilo nič obdelano.

Za uničenje napak uporabite ukaz OnError

Pri tem se uporabi ukaz 'On Error Resume Next'. To je zelo nevarno vključiti v kodo, saj preprečuje, da bi se prikazale naknadne napake. To v bistvu pomeni, da se bo med izvajanjem kode, če pride do napake v vrstici kode, izvedba premaknila v naslednjo razpoložljivo vrstico, ne da bi izvršila vrstico napake, in nadaljevala kot običajno.

To bi lahko rešilo potencialno napako, vendar bo še vedno vplivalo na vsako prihodnjo napako v kodi. Morda boste potem mislili, da je vaša koda brez hroščev, v resnici pa ni in deli vaše kode ne delujejo tako, kot mislite, da bi morali biti.

Obstajajo primeri, ko je treba uporabiti ta ukaz, na primer, če datoteko brišete z ukazom 'Kill' (če datoteka ni prisotna, bo prišlo do napake), vendar je treba lovljenje napak vedno preklopiti nazaj takoj po tem, kjer bi lahko prišlo do možne napake, z uporabo:

1 Pri napaki Pojdi na 0

V prejšnjem primeru zvijanja po obsegu celic z uporabo 'On Error Resume Next' bi to omogočilo nadaljevanje zanke, vendar celica, ki je povzročila napako, ne bi bila prenesena v matriko in element matrike za ta indeks bi imela ničelno vrednost.

Pretvarjanje podatkov v podatkovno vrsto za ujemanje z deklaracijo

S funkcijami VBA lahko spremenite podatkovni tip vhodnih podatkov, tako da se ujema s podatkovnim tipom sprejemne spremenljivke.

To lahko storite pri posredovanju parametrov v funkcije. Na primer, če imate številko, ki je shranjena v spremenljivki niza, in jo želite kot številko posredovati funkciji, lahko uporabite CInt

Obstaja več teh funkcij pretvorbe, ki jih je mogoče uporabiti, vendar so tukaj glavne:

CInt - pretvori niz, ki ima številsko vrednost (pod + ali - 32,768) v celoštevilčno vrednost. Zavedajte se, da to skrajša vse decimalke

CLng - Pretvori niz, ki ima veliko številsko vrednost, v dolgo celo število. Decimalne točke so odrezane.

CDbl - Pretvori niz s številko s plavajočo decimalno vejico v število z dvojno natančnostjo. Vključuje decimalne pike

CDate - Pretvori niz, ki vsebuje datum, v datumsko spremenljivko. Delno je odvisno od nastavitev na nadzorni plošči sistema Windows in vašega jezika glede na to, kako se datum razlaga

CStr - Pretvori številsko ali datumsko vrednost v niz

Pri pretvorbi iz niza v številko ali datum niz ne sme vsebovati nič drugega kot številke ali datum. Če so prisotni alfa znaki, bo to povzročilo napako pri neusklajenosti. Tu je primer, ki bo povzročil napako pri neusklajenosti:

123 Pod test ()MsgBox CInt ("123abc")End Sub

Testiranje spremenljivk v vaši kodi

Spremenljivko lahko preizkusite, da ugotovite, za kakšen podatkovni tip gre, preden jo dodelite spremenljivki določene vrste.

Niz lahko na primer preverite, če je numeričen, s funkcijo 'IsNumeric' v VBA

1 MsgBox IsNumeric ("123test")

Ta koda bo vrnila False, ker čeprav se niz začne s številskimi znaki, vsebuje tudi besedilo, zato test ne uspe.

1 MsgBox IsNumeric ("123")

Ta koda bo vrnila vrednost True, ker so vsi številski znaki

V VBA obstaja več funkcij za testiranje različnih podatkovnih tipov, vendar so te glavne:

IsNumeric - preveri, ali je izraz številka ali ne

IsDate - preveri, ali je izraz datum ali ne

IsNull - preveri, ali je izraz ničelni ali ne. Ničelno vrednost lahko vnesete samo v različni predmet, sicer boste dobili napako "Neveljavna uporaba ničelne vrednosti". Polje s sporočilom vrne ničelno vrednost, če ga uporabljate za postavljanje vprašanja, zato mora biti vrnitev spremenljivka različica. Upoštevajte, da bo vsak izračun, ki uporablja ničelno vrednost, vedno vrnil rezultat ničelne vrednosti.

IsArray - preveri, ali izraz predstavlja matriko ali ne

IsEmpty - preizkusi, ali je izraz prazen ali ne. Upoštevajte, da prazno ni isto kot ničelno. Spremenljivka je prazna, ko je prvič definirana, vendar ni ničelna vrednost

Presenetljivo je, da za IsText ali IsString ni funkcije, ki bi bila resnično koristna

Objekti in napake pri neusklajenosti

Če uporabljate predmete, kot sta obseg ali list, boste dobili napako pri neusklajenosti v času sestavljanja, ne v času izvajanja, kar vas ustrezno opozori, da vaša koda ne bo delovala

123456 Pod TestRange ()Dim MyRange As Range, I As LongNastavi MyRange = Obseg ("A1: A2")I = 10x = UseMyRange (I)End Sub
12 Funkcija UseMyRange (R kot obseg)Končana funkcija

Ta koda ima funkcijo, imenovano "UseMyRange", in parameter, ki se posreduje kot predmet obsega. Vendar je parameter, ki se posreduje, dolgo celo število, ki se ne ujema s podatkovnim tipom.

Ko zaženete kodo VBA, se takoj prevede in prikazalo se bo to sporočilo o napaki:

Kršilni parameter bo označen z modrim ozadjem

Na splošno, če naredite napako v kodi VBA z uporabo predmetov, boste videli to sporočilo o napaki in ne sporočilo o neskladju vrste:

Vam bo pomagal razvoj spletnega mesta, ki si delijo stran s svojimi prijatelji

wave wave wave wave wave