Neatkarīgi no tā, cik pieredzējis esat VBA kodēšanā, kļūdas vienmēr būs tā sastāvdaļa.
Atšķirība starp iesācēju un ekspertu VBA programmētāju ir tā, ka eksperti programmētāji zina, kā efektīvi rīkoties un izmantot kļūdas.
Šajā apmācībā es jums parādīšu dažādus veidus, kā efektīvi izmantot kļūdas programmā Excel VBA.
Pirms ķeramies pie VBA kļūdu apstrādes, vispirms sapratīsim dažāda veida kļūdas, ar kurām, iespējams, sastapsities, programmējot programmā Excel VBA.
VBA kļūdu veidi programmā Excel
Programmā Excel VBA ir četru veidu kļūdas:
- Sintakses kļūdas
- Apkopošanas kļūdas
- Izpildlaika kļūdas
- Loģiskās kļūdas
Ātri sapratīsim, kas ir šīs kļūdas un kad jūs, iespējams, tās sasniegsit.
Sintakses kļūda
Sintakses kļūda, kā norāda nosaukums, rodas, ja VBA atrod kaut ko nepareizu ar sintaksi kodā.
Piemēram, ja esat aizmirsis nepieciešamo paziņojuma/sintakses daļu, jūs redzēsit apkopošanas kļūdu.
Zemāk esošajā kodā, tiklīdz es nospiedu enter pēc otrās rindas, es redzu kompilācijas kļūdu. Tas ir tāpēc, ka IF paziņojums ir jābūt 'Tad'Komanda, kuras trūkst zemāk esošajā kodā.
Lai pārliecinātos, ka redzat sintakses kļūdu ikreiz, kad kaut kas trūkst, jums jāpārliecinās, vai ir iespējota automātiskās sintakses pārbaude. Lai to izdarītu, noklikšķiniet uz “Rīki” un pēc tam uz “Opcijas”. Opciju dialoglodziņā pārliecinieties, vai ir iespējota opcija “Automātiskā sintakses pārbaude”.
Ja opcija “Automātiskā sintakses pārbaude” ir atspējota, VBA joprojām iezīmēs līniju ar sintakses kļūdu sarkanā krāsā, taču netiks parādīts kļūdas dialoglodziņš.
Kompilēšanas kļūda
Kompilēšanas kļūdas rodas, ja trūkst kaut kas, kas nepieciešams koda darbībai.
Piemēram, zemāk esošajā kodā, tiklīdz es mēģināšu palaist kodu, tas parādīs šādu kļūdu. Tas notiek, kad esmu izmantojis IF IF paziņojumu, neaizverot to ar obligāto “End If”.
Rakstot kodu, VBA pārbauda katru rindu un izceļ sintakses kļūdu, tiklīdz rinda ir nepareiza un jūs nospiežat taustiņu Enter. No otras puses, apkopošanas kļūdas tiek identificētas tikai tad, kad VBA analizē visu kodu.
Tālāk ir norādīti daži scenāriji, kuros var rasties apkopošanas kļūda.
- IF pārskata izmantošana bez beigu IF
- Izmantojot paziņojumu For ar Next
- Izmantojot paziņojumu Atlasīt, neizmantojot beigu atlasi
- Mainīgā nedeklarēšana (tas darbojas tikai tad, ja opcija Explicit ir iespējota)
- Apakšfunkcijas/funkcijas izsaukšana, kas neeksistē (vai ar nepareiziem parametriem)
Izpildlaika kļūdas
Izpildlaika kļūdas ir tās, kas rodas, kad kods darbojas.
Izpildlaika kļūdas radīsies tikai tad, ja tiks novērstas visas sintakses un apkopošanas kļūdas.
Piemēram, ja palaižat kodu, kuram vajadzētu atvērt Excel darbgrāmatu, bet šī darbgrāmata nav pieejama (vai nu dzēsta, vai mainīts nosaukums), kods parādīs izpildlaika kļūdu.
Ja rodas izpildlaika kļūda, tas pārtrauks kodu un parādīs kļūdas dialoglodziņu.
Ziņojums dialoglodziņā Izpildlaika kļūda ir nedaudz noderīgāks. Tas mēģina izskaidrot problēmu, kas var palīdzēt to novērst.
Ja noklikšķināsit uz atkļūdošanas pogas, tā iezīmēs to koda daļu, kas noved pie kļūdas.
Ja esat izlabojis kļūdu, varat rīkjoslā noklikšķināt uz pogas Palaist (vai nospiest F5), lai turpinātu koda darbību no vietas, kur tā tika atstāta.
Vai arī varat noklikšķināt uz pogas Beigt, lai izietu no koda.
Svarīgs: Ja dialoglodziņā noklikšķināsit uz pogas Beigt, kods tiks apturēts tajā rindā, pie kuras tas ir sastopams. Tomēr visas koda rindas pirms tam būtu izpildītas.Loģiskās kļūdas
Loģisku kļūdu dēļ jūsu kods netiktu apturēts, bet varētu novest pie nepareiziem rezultātiem. Šie varētu būt arī visgrūtāk novēršamie kļūdu veidi.
Sastādītājs šīs kļūdas neizceļ, un tās ir jārisina manuāli.
Viens loģiskas kļūdas piemērs (ar kuru es bieži sastopos iestrēdzis) ir nebeidzama cilpa.
Vēl viens piemērs varētu būt, ja tas dod nepareizu rezultātu. Piemēram, jūs varat kodā izmantot nepareizu mainīgo vai pievienot divus mainīgos, ja viens ir nepareizs.
Ir daži veidi, kā izmantot loģiskās kļūdas:
- Ievietojiet ziņojumu lodziņu kādā koda vietā un iezīmējiet vērtības/datus, kas var palīdzēt saprast, vai viss notiek tā, kā paredzēts.
- Tā vietā, lai palaistu kodu vienā piegājienā, ejiet cauri katrai rindai pa vienam. Lai to izdarītu, koda vietā noklikšķiniet uz jebkuras vietas un nospiediet F8. Jūs pamanīsit, ka katru reizi, nospiežot F8, tiek izpildīta viena rinda. Tas ļauj jums iziet kodu pa vienai rindai un noteikt loģiskās kļūdas.
Atkļūdošanas izmantošana kompilācijas/sintakses kļūdu atrašanai
Kad esat pabeidzis kodu, ir laba prakse to vispirms apkopot pirms palaišanas.
Lai apkopotu kodu, rīkjoslā noklikšķiniet uz opcijas Atkļūdošana un noklikšķiniet uz Kompilēt VBAProject.
Apkopojot VBA projektu, tas iziet kodu un identificē kļūdas (ja tādas ir).
Ja tiek atrasta kļūda, tas parādīs dialoglodziņu ar kļūdu. Tas atrod kļūdas pa vienam. Tātad, ja tas atrod kļūdu un esat to izlabojis, jums vēlreiz jāpalaiž kompilēšana, lai atrastu citas kļūdas (ja tādas ir).
Ja kodā nav kļūdu, opcija Compile VBAProject būs pelēka.
Ņemiet vērā, ka kompilēšana atradīs tikai “sintakses” un “kompilēšanas” kļūdas. Tas neatradīs izpildlaika kļūdas.
Rakstot VBA kodu, nevēlaties, lai tiktu parādītas kļūdas. Lai no tā izvairītos, varat izmantot daudzas kļūdu apstrādes metodes.
Nākamajās šī raksta sadaļās es apskatīšu metodes, kuras varat izmantot VBA kļūdu apstrādei programmā Excel.
Konfigurējiet kļūdu iestatījumus (apstrādātās un neapstrādātās kļūdas)
Pirms sākat strādāt ar kodu, jums ir jāpārbauda viens iestatījums programmā Excel VBA.
Dodieties uz VBA rīkjoslu un noklikšķiniet uz Rīki un pēc tam uz Opcijas.
Dialoglodziņā Opcijas noklikšķiniet uz cilnes Vispārīgi un pārliecinieties, ka grupā “Kļūdu slazdošana” ir atzīmēta opcija “Pārtraukt neapstrādātas kļūdas”.
Ļaujiet man izskaidrot trīs iespējas:
- Pārtrauciet visas kļūdas: Tas apturēs jūsu kodu visu veidu kļūdu gadījumā, pat ja esat izmantojis šo kļūdu novēršanas paņēmienus.
- Pārtraukums klases modulī: Tas apturēs jūsu kodu uz visām neapstrādātajām kļūdām, un tajā pašā laikā, ja izmantojat tādus objektus kā Userforms, tas arī sadalīsies šajos objektos un iezīmēs precīzu līniju, kas izraisa kļūdu.
- Pārtraukums par neapstrādātām kļūdām: Tas apturēs jūsu kodu tikai to kļūdu gadījumā, kuras netiek apstrādātas. Šis ir noklusējuma iestatījums, jo tas nodrošina, ka tiek pamanītas visas neapstrādātās kļūdas. Ja izmantojat tādus objektus kā Userforms, tas neizceļ līniju, kas rada kļūdu objektā, bet tikai izceļ līniju, kas attiecas uz šo objektu.
Īsumā - ja jūs tikko sākat darbu ar Excel VBA, pārliecinieties, vai ir atzīmēta opcija “Pārtraukt neapstrādātas kļūdas”.
VBA kļūdu apstrāde ar paziņojumiem “Kļūda”
Ja kodā rodas kļūda, varat rīkoties šādi:
- Ignorējiet kļūdu un ļaujiet kodam turpināt
- Ievietojiet kļūdas apstrādes kodu un palaidiet to, kad rodas kļūda
Abas šīs kļūdu apstrādes metodes nodrošina, ka galalietotājs neredzēs kļūdu.
Ir daži paziņojumi par kļūdu, kurus varat izmantot, lai tos paveiktu.
Par kļūdu Atsākt nākamo
Ja savā kodā izmantojat opciju “Ieslēgt kļūdu, atsākot nākamo”, visas radušās kļūdas tiks ignorētas un kods turpinās darboties.
Šī kļūdu apstrādes metode tiek izmantota diezgan bieži, taču, to lietojot, jums jābūt piesardzīgam. Tā kā tā pilnībā ignorē visas iespējamās kļūdas, iespējams, nevarēsit noteikt kļūdas, kuras ir jālabo.
Piemēram, ja tiek palaists zemāk esošais kods, tas atgriezīs kļūdu.
Sub AssignValues () x = 20 /4 y = 30 /0 Beigt apakš
Tas notiek tāpēc, ka jūs nevarat dalīt skaitli ar nulli.
Bet, ja šajā kodā izmantošu paziņojumu “Par kļūdu, atsākot nākamo” (kā parādīts zemāk), tas kļūdu ignorēs un es nezināšu, ka ir kāda problēma, kas ir jālabo.
Sub AssignValues () On Error Resume Next x = 20 /4 y = 30 /0 Beigt apakš
Ieslēgt kļūdu Atsākt nākamo vajadzētu izmantot tikai tad, ja skaidri zināt, kādas kļūdas jūsu VBA kods varētu radīt, un ir pareizi to ignorēt.
Piemēram, zemāk ir VBA notikuma kods, kas uzreiz pievienotu datuma un laika vērtību nesen ievietotas lapas šūnā A1 (šis kods tiek pievienots darblapā, nevis modulī).
Privāta apakšdarbgrāmata_Jauna lapa (ByVal Sh kā objekts) Sh.Range ("A1") = Formāts (tagad, "dd-mmm-gggg hh: mm: ss") Beigu apakšdaļa
Lai gan tas vairumā gadījumu darbojas lieliski, tas parādītu kļūdu, ja darblapas vietā pievienotu diagrammas lapu. Tā kā diagrammas lapā nav šūnu, kods radīs kļūdu.
Tātad, ja šajā kodā izmantoju paziņojumu “Par kļūdu, atsākot nākamo”, tas darbosies, kā paredzēts, ar darblapām un nedarīs neko ar diagrammu lapām.
Privāta apakšdarbgrāmata_Jauna lapa (ByVal Sh kā objekts) Par kļūdu Atsākt Nākamo Sh.Range ("A1") = Formāts (Tagad, "dd-mmm-gggg hh: mm: ss") Beigu apakšdaļa
Piezīme. Par kļūdu atsākt nākamo paziņojumu vislabāk izmantot, ja zināt, ar kādām kļūdām jūs varētu saskarties. Un tad, ja uzskatāt, ka ir droši ignorēt šīs kļūdas, varat to izmantot.
Varat pārvietot šo kodu uz nākamo līmeni, analizējot, vai radusies kļūda, un parādot tam atbilstošu ziņojumu.
Zemāk redzamais kods parādītu ziņojumu lodziņu, kas informētu lietotāju, ka darblapa nav ievietota.
Private Sub Workbook_NewSheet (ByVal Sh as Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") Ja Err.Number 0, tad MsgBox "Izskatās pēc jums ievietota diagrammas lapa "& vbCrLf &" Kļūda - "& Err.Description End If End Sub
“Err.Number” tiek izmantots, lai iegūtu kļūdas numuru, un “Err.Description” tiek izmantots, lai iegūtu kļūdas aprakstu. Tie tiks aplūkoti vēlāk šajā apmācībā.
Kļūda GoTo 0
“On Error GoTo 0” pārtrauks kodu rindā, kas izraisa kļūdu, un parādīs ziņojumu lodziņu, kurā aprakstīta kļūda.
Vienkārši sakot, tas nodrošina noklusējuma kļūdu pārbaudes darbību un parāda noklusējuma kļūdas ziņojumu.
Tad kāpēc pat to izmantot?
Parasti jums nav jāizmanto “On Error Goto 0”, taču tas var būt noderīgi, ja to lietojat kopā ar “On Error Resume Next”
Ļauj man paskaidrot!
Zemāk esošais kods atlasītu visas tukšās atlases šūnas.
Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks). Atlasiet beigu apakšdaļu
Bet tas parādītu kļūdu, ja atlasītajās šūnās nav tukšu šūnu.
Lai izvairītos no kļūdas parādīšanas, varat izmantot Ieslēgt kļūdu Atsākt
Tagad tas parādīs arī jebkuru kļūdu, palaižot zemāk esošo kodu:
Sub SelectFormulaCells () pēc kļūdas Atsākt nākamo atlasi. SpecialCells (xlCellTypeBlanks). Atlasiet beigu apakšdaļu
Tik tālu, labi!
Problēma rodas, ja ir kāda koda daļa, kurā var rasties kļūda, un, tā kā jūs izmantojat opciju “Ieslēgt kļūdu, atsākot nākamo”, kods to vienkārši ignorē un pāriet uz nākamo rindu.
Piemēram, zemāk esošajā kodā netiks parādīts kļūdas ziņojums:
Sub SelectFormulaCells () Kļūda Atsākt nākamo atlasi. SpecialCells (xlCellTypeBlanks). Atlasiet “… vairāk kodu, kas var saturēt kļūdu Beigt apakšdaļu
Iepriekš minētajā kodā ir divas vietas, kur var rasties kļūda. Pirmā vieta ir vieta, kur mēs atlasām visas tukšās šūnas (izmantojot Selection.SpecialCells), bet otrā - atlikušajā kodā.
Lai gan tiek gaidīta pirmā kļūda, jebkura kļūda pēc tās nav.
Tieši šeit uz kļūdu Goto 0 nāk glābt.
Kad to izmantojat, jūs atiestatāt kļūdas iestatījumu uz noklusējumu, kur tas sāks parādīt kļūdas, kad tas tiks atklāts.
Piemēram, zemāk esošajā kodā nebūtu kļūdu, ja nav tukšu šūnu, bet būtu kļūdas uzvedne “10/0” dēļ
Sub SelectFormulaCells () On Error Atsākt nākamo atlasi. SpecialCells (xlCellTypeBlanks). Atlasiet On Error GoTo 0 '… vairāk kodu, kas var saturēt kļūdu End Sub
Kļūda Goto [iezīme]
Iepriekš minētās divas metodes - “On Error Resume Next” un “On Error Goto 0” - neļauj mums patiesi rīkoties ar kļūdu. Viens liek kodam ignorēt kļūdu, bet otrais atsāk kļūdu pārbaudi.
On Error Go [Label] ir veids, kā jūs varat norādīt, ko vēlaties darīt, ja jūsu kodam ir kļūda.
Zemāk ir koda struktūra, kas izmanto šo kļūdu apstrādātāju:
Apakštests () Kļūdā GoTo Label: X = 10 /0 'šī rinda izraisa kļūdu' …. Jūsu atlikušais kods iet šeit Iziet no apakšzīmes: 'kods, lai apstrādātu kļūdu End Sub
Ņemiet vērā, ka pirms kļūdu apstrādes ar iezīmi ir izejas apakšdaļa. Tas nodrošina, ka gadījumā, ja nav kļūdu, apakšdaļa tiek aizvērta un kods “Label” netiek izpildīts. Ja neizmantojat Exit Sub, tas vienmēr izpildīs kodu “Label”.
Tālāk redzamajā koda piemērā, kad rodas kļūda, kods pārlec un izpilda kodu apstrādātāja sadaļā (un parāda ziņojumu lodziņu).
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Šķiet, ka ir kļūda" & vbCrLf & Err.Description End Sub
Ņemiet vērā: ja rodas kļūda, kods jau ir izpildīts un izpildījis rindas pirms rindas, kas izraisa kļūdu. Iepriekš minētajā piemērā kods nosaka X vērtību kā 12, bet, tā kā kļūda rodas nākamajā rindā, tas nenosaka Y un Z vērtības.
Kad kods pāriet uz kļūdu apstrādātāja kodu (šajā piemērā ErrMsg), tas turpinās izpildīt visas rindas, kas atrodas kļūdas apstrādātāja kodā un zem tā, un iziet no apakšsadaļas.
Kļūda Goto -1
Šis ir nedaudz sarežģīts, un vairumā gadījumu jūs diez vai to izmantosit.
Bet es joprojām to apskatīšu, jo esmu saskārusies ar situāciju, kad tas bija vajadzīgs (nekautrējieties ignorēt un pāriet uz nākamo sadaļu, ja meklējat tikai pamatus).
Pirms iedziļināties tās mehānikā, ļaujiet man mēģināt izskaidrot, kur tas var būt noderīgi.
Pieņemsim, ka jums ir kods, kurā rodas kļūda. Bet viss ir labi, jo jums ir viens kļūdu apstrādātājs. Bet kas notiek, ja kļūdu apstrādātāja kodā ir cita kļūda (jā … nedaudz līdzīga filmas sākumam).
Šādā gadījumā otro apstrādātāju nevar izmantot, jo pirmā kļūda nav novērsta. Tātad, kamēr esat apstrādājis pirmo kļūdu, VBA atmiņā tā joprojām pastāv. Un VBA atmiņā ir vieta tikai vienai kļūdai - ne divām vai vairāk.
Šādā gadījumā varat izmantot On Error Goto -1.
Tas izdzēš kļūdu un atbrīvo VBA atmiņu, lai apstrādātu nākamo kļūdu.
Pietiek runāt!
Tagad paskaidrošu, izmantojot piemērus.
Pieņemsim, ka man ir zemāk esošais kods. Tas radīs kļūdu, jo ir dalījums ar nulli.
Apakšējais kļūdu apstrādātājs () X = 12 Y = 20 /0 Z = 30 End Sub
Tātad, lai to apstrādātu, es izmantoju kļūdu apstrādātāja kodu (ar nosaukumu ErrMsg), kā parādīts zemāk:
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Šķiet, ka ir kļūda" & vbCrLf & Err.Description End Sub
Tagad atkal viss ir labi. Tiklīdz rodas kļūda, tiek izmantots kļūdu apstrādātājs un tiek parādīts ziņojumu lodziņš, kā parādīts zemāk.
Tagad es paplašinu kodu, lai kļūdu apstrādātājā vai pēc tā būtu vairāk kodu.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Šķiet, ka ir kļūda" & vbCrLf & Err.Apraksts A = 10 /2 B = 35 /0 End Sub
Tā kā pirmā kļūda ir apstrādāta, bet otrā nav, es atkal redzu kļūdu, kā parādīts zemāk.
Joprojām viss labi. Kods darbojas tā, kā mēs to gaidījām.
Tātad, lai apstrādātu otro kļūdu, es izmantoju citu kļūdu apstrādātāju (ErrMsg2).
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Šķiet, ka ir kļūda" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10 /2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Šķiet, ka atkal ir kļūda" & vbCrLf & Err.Dapcription End Sub
Un šeit tas ir nedarbojas kā paredzēts.
Ja palaižat iepriekš minēto kodu, tas joprojām parādīs izpildlaika kļūdu, pat pēc otrā kļūdu apstrādātāja ievietošanas.
Tas notiek, jo mēs neizdzēsām pirmo kļūdu no VBA atmiņas.
Jā, mēs tikām galā! Bet tas joprojām paliek atmiņā.
Un, kad VBA sastopas ar citu kļūdu, tā joprojām ir iestrēdzis ar pirmo kļūdu, un tāpēc otrais kļūdu apstrādātājs netiek izmantots. Kods apstājas pie līnijas, kas izraisīja kļūdu, un parāda kļūdas uzvedni.
Lai notīrītu VBA atmiņu un notīrītu iepriekšējo kļūdu, jums jāizmanto “Ieslēgta kļūda Goto -1”.
Tātad, ja pievienosit šo rindu zemāk esošajam kodam un palaidīsit to, tā darbosies, kā paredzēts.
Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20 /0 Z = 30 Exit Sub ErrMsg: MsgBox "Šķiet, ka ir kļūda" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35 /0 Iziet no apakškļūdas ErrMsg2: MsgBox "Šķiet, ka atkal ir kļūda" & vbCrLf & Err.Description End SubPiezīme: Kļūda tiek automātiski novērsta, kad apakšprogramma beidzas.Tātad “On Error Goto -1” var būt noderīgs, ja vienā apakšprogrammā tiek parādītas divas vai vairāk kļūdas.
Kļūdas objekts
Ikreiz, kad ar kodu rodas kļūda, objekts Err tiek izmantots, lai iegūtu sīkāku informāciju par kļūdu (piemēram, kļūdas numuru vai aprakstu).
Kļūda Objekta rekvizīti
Objektam Err ir šādas īpašības:
Īpašums | Apraksts |
Skaitlis | Skaitlis, kas apzīmē kļūdas veidu. Ja nav kļūdas, šī vērtība ir 0 |
Apraksts | Īss kļūdas apraksts |
Avots | Projekta nosaukums, kurā radusies kļūda |
HelpContext | Palīdzības konteksta ID kļūdas gadījumam palīdzības failā |
HelpFile | Virkne, kas apzīmē mapes atrašanās vietu un palīdzības faila faila nosaukumu |
Lai gan vairumā gadījumu jums nav jāizmanto Err objekts, dažreiz tas var būt noderīgi, apstrādājot kļūdas programmā Excel.
Piemēram, pieņemsim, ka jums ir datu kopa, kā parādīts zemāk, un katram skaitlim atlasē vēlaties aprēķināt kvadrātsakni blakus esošajā šūnā.
Zemāk redzamais kods to var izdarīt, bet, tā kā šūnā A5 ir teksta virkne, tas parāda kļūdu, tiklīdz tas notiek.
Sub FindSqrRoot () Dim rng kā diapazona kopa rng = Atlase katrai šūnai rng šūnā. Nobīde (0, 1). Vērtība = Sqr (šūna. Vērtība) Nākamā šūna End Sub
Šāda veida kļūdas ziņojuma problēma ir tā, ka tā neko nesniedz par to, kas ir nogājis greizi un kur problēma radusies.
Lai padarītu šos kļūdu ziņojumus nozīmīgākus, varat izmantot objektu Err.
Piemēram, ja es tagad izmantoju zemāk redzamo VBA kodu, tas pārtrauks kodu, tiklīdz radīsies kļūda, un parādīs ziņojumu lodziņu ar tās šūnas šūnas adresi, kurā ir problēma.
Sub FindSqrRoot () Dim rng kā diapazons Iestatīt rng = Atlase katrai šūnai In rng On Kļūda GoTo ErrHandler šūna.Pārvietojums (0, 1) .Value = Sqr (cell.Value) Nākamā šūna ErrHandler: MsgBox "Kļūdas numurs:" & Err .Number & vbCrLf & _ "Kļūdas apraksts:" & Err.Description & vbCrLf & _ "Kļūda:" & cell.Address End Sub
Iepriekš minētais kods sniegtu jums daudz vairāk informācijas nekā vienkāršā “tipa neatbilstība”, jo īpaši šūnas adrese, lai jūs zināt, kur radās kļūda.
Jūs varat vēl vairāk precizēt šo kodu, lai pārliecinātos, ka jūsu kods darbojas līdz beigām (tā vietā, lai pie katras kļūdas tiktu pārtraukts), un pēc tam sniedz jums sarakstu ar šūnu adresēm, kurās rodas kļūda.
Zemāk esošais kods to darīs:
Sub FindSqrRoot2 () Dim ErrorCells Kā virkne Dim rng kā diapazons uz kļūdu Atsākt nākamo Iestatīt rng = Atlase katrai šūnai rng šūnā. Nobīde (0, 1). Vērtība = Sqr (cell.Value) Ja Err.Number 0, tad ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Kļūda šādās šūnās" & ErrorCells Exit Sub End Sub
Iepriekš minētais kods darbojas līdz beigām un dod kvadrātsakni visām šūnām, kurās ir skaitļi (blakus esošajā kolonnā). Pēc tam tiek parādīts ziņojums, kurā uzskaitītas visas šūnas, kurās radusies kļūda (kā parādīts zemāk):
Kļūda Objekta metodes
Lai gan kļūdu rekvizīti ir noderīgi, lai parādītu noderīgu informāciju par kļūdām, ir arī divas kļūdu metodes, kas var palīdzēt ar kļūdu apstrādi.
Metode | Apraksts |
Skaidrs | Notīra visus Err objekta rekvizītu iestatījumus |
Paceliet | Izveido izpildes laika kļūdu |
Ātri uzzināsim, kas tie ir un kā/kāpēc tos izmantot kopā ar VBA programmā Excel.
Kļūdas skaidrā metode
Pieņemsim, ka jums ir datu kopa, kā parādīts zemāk, un vēlaties iegūt visu šo skaitļu kvadrātsakni blakus esošajā kolonnā.
Šis kods iegūs blakus esošo kolonnu visu skaitļu kvadrātsaknes un parādīs ziņojumu, ka šūnās A5 un A9 radās kļūda (jo tajās ir teksts).
Sub FindSqrRoot2 () Dim ErrorCells Kā virkne Dim rng kā diapazons uz kļūdu Atsākt nākamo Iestatīt rng = Atlase katrai šūnai rng šūnā. Nobīde (0, 1). Vērtība = Sqr (cell.Value) Ja Err.Number 0, tad ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End if Next cell MsgBox "Kļūda šādās šūnās" & ErrorCells End Sub
Ņemiet vērā, ka paziņojumā Ja pēc tam esmu izmantojis Err.Clear metodi.
Kad ir notikusi kļūda un tā ir ieslodzīta nosacījumā If, Err.Clear metode atiestata kļūdas numuru atpakaļ uz 0. Tas nodrošina, ka IF nosacījums uztver kļūdas tikai šūnās, kur tā ir izvirzīta.
Ja es nebūtu izmantojis Err.Clear metodi, tad, kad rodas kļūda, IF stāvoklī tā vienmēr būtu taisnība, un kļūdas numurs nav atiestatīts.
Vēl viens veids, kā padarīt šo darbu, ir izmantot On Error Goto -1, kas kļūdu pilnībā atiestata.
Piezīme: Err.Clear atšķiras no On Error Goto -1. Err. Clear notīra tikai kļūdas aprakstu un kļūdas numuru. tas to pilnībā neatjauno. Tas nozīmē, ka, ja tajā pašā kodā ir vēl viens kļūdas gadījums, jūs nevarēsit to apstrādāt pirms tā atiestatīšanas (ko var izdarīt, izmantojot “Ieslēgta kļūda Goto -1”, nevis “Err.Clear”).Kļūdas paaugstināšanas metode
Err.Raise metode ļauj paaugstināt izpildlaika kļūdu.
Zemāk ir Err.Raise metodes izmantošanas sintakse:
Err.Raise [numurs], [avots], [apraksts], [palīdzības fails], [palīdzības konteksts]
Visi šie argumenti nav obligāti, un jūs varat tos izmantot, lai padarītu kļūdas ziņojumu nozīmīgāku.
Bet kāpēc jūs kādreiz vēlaties pats pieļaut kļūdu?
Labs jautājums!
Šo metodi varat izmantot, ja ir kļūdas gadījums (tas nozīmē, ka jebkurā gadījumā rodas kļūda), un pēc tam izmantojat šo metodi, lai lietotājam vairāk pastāstītu par kļūdu (nevis mazāk noderīgo kļūdas ziņojumu, ko parāda VBA) pēc noklusējuma).
Piemēram, pieņemsim, ka jums ir datu kopa, kā parādīts zemāk, un vēlaties, lai visām šūnām būtu tikai skaitliskas vērtības.
Sub RaiseError () Dim rng kā diapazona kopa rng = Atlase uz kļūdu GoTo ErrHandler katrai šūnai, kas atrodas rng Ja nē (IsNumeric (Cell.Value)) Tad Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "Beigt, ja nākamā šūnu kļūdaHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub
Iepriekš minētais kods parādītu kļūdas ziņojumu ar norādīto aprakstu un konteksta failu.
Personīgi es nekad neesmu izmantojis Err.Raise, jo pārsvarā strādāju tikai ar Excel. Bet kādam, kurš izmanto VBA, lai strādātu ar Excel kopā ar citām lietojumprogrammām, piemēram, Outlook, Word vai PowerPoint, tas var būt noderīgi.
Šeit ir detalizēts raksts par Err.Raise metodi, ja vēlaties uzzināt vairāk.
VBA kļūdu apstrādes paraugprakse
Neatkarīgi no tā, cik prasmīgi jūs rakstāt VBA kodu, kļūdas vienmēr būs tā sastāvdaļa. Labākie kodētāji ir tie, kuriem ir prasmes pareizi rīkoties ar šīm kļūdām.
Šeit ir daži paraugprakses piemēri, kurus varat izmantot kļūdu apstrādei programmā Excel VBA.
- Izmantojiet “On Error Go [Label]” koda sākumā. Tas nodrošinās, ka visas kļūdas, kas var rasties no turienes, tiek apstrādātas.
- Izmantojiet “Ieslēgt kļūdu, lai atsāktu” TIKAI tad, ja esat pārliecināts par iespējamām kļūdām. Izmantojiet to tikai ar paredzamo kļūdu. Ja izmantojat to ar neparedzētām kļūdām, tas to vienkārši ignorēs un virzīsies uz priekšu. Varat izmantot “On Error Resume Next” (Atsākt kļūdu) ar “Err.Raise”, ja vēlaties ignorēt noteikta veida kļūdu un pārējo pamanīt.
- Izmantojot kļūdu apstrādātājus, pirms apstrādātājiem noteikti izmantojiet Exit Sub. Tas nodrošinās, ka kļūdu apstrādātāja kods tiek izpildīts tikai tad, ja ir kļūda (pretējā gadījumā tas vienmēr tiks izpildīts).
- Izmantojiet vairākus kļūdu apstrādātājus, lai notvertu dažāda veida kļūdas. Vairāku kļūdu apstrādātājs nodrošina, ka kļūda tiek pareizi novērsta. Piemēram, jūs vēlaties apstrādāt “tipa neatbilstības” kļūdu citādi nekā “Sadalīšana ar 0” izpildlaika kļūdu.
Ceru, ka šis Excel raksts jums šķita noderīgs!
Šeit ir vēl dažas Excel VBA apmācības, kas jums varētu patikt:
- Excel VBA datu tipi - pilnīgs ceļvedis
- Excel VBA cilpas - nākamajam, dariet laiku, dariet līdz, katram
- Excel VBA notikumi - vienkāršs (un pilnīgs) ceļvedis
- Excel Visual Basic redaktors - kā to atvērt un lietot programmā Excel