Ja jums ir jārisina kļūdas programmā Excel VBA, varat izmantot paziņojumu OnError. Tomēr vispirms ir jāzina dažas lietas. Paziņojumu On Error varat izmantot trīs veidos.
Sintakse |
Ko tas dara |
Par kļūdu GoTo etiķeti |
Pēc šī priekšraksta izpildes VBA atsāk izpildi no
priekšraksta, kas seko norādītajai iezīmei. Aiz
etiķetes jāiekļauj kols, lai VBA to atpazītu kā etiķeti. |
Par kļūdu GoTo 0 |
Pēc šī paziņojuma izpildes VBA atsāk savu parasto
kļūdu pārbaudes darbību. Izmantojiet šo paziņojumu pēc kāda
cita paziņojuma On Error izmantošanas vai ja vēlaties
savā procedūrā noņemt kļūdu apstrādi . |
Kļūdas gadījumā atsākt nākamo |
Pēc šī paziņojuma izpildes VBA vienkārši ignorē visas kļūdas
un atsāk izpildi ar nākamo paziņojumu. |
Atsākšana pēc kļūdas
Dažos gadījumos jūs vienkārši vēlaties, lai rutīna tiktu graciozi beigusies, kad rodas kļūda. Piemēram, varat parādīt ziņojumu, kurā aprakstīta kļūda, un pēc tam iziet no procedūras. (Iepriekš parādītajā EnterSquareRoot5 piemērā šī metode tiek izmantota.) Citos gadījumos, ja iespējams, vēlaties atkopt kļūdu.
Lai atgūtu kļūdu, ir jāizmanto atsākšanas paziņojums. Tas izdzēš kļūdas stāvokli un ļauj turpināt izpildi noteiktā vietā. Paziņojumu CV varat izmantot trīs veidos.
Sintakse |
Ko tas dara |
Turpināt |
Izpilde tiek atsākta ar paziņojumu, kas izraisīja kļūdu. Izmantojiet
to, ja kļūdu apstrādes kods novērš problēmu un
ir pareizi turpināt. |
Atsākt Nākamo |
Izpilde tiek atsākta ar paziņojumu tūlīt pēc
paziņojuma, kas izraisīja kļūdu. Tas būtībā ignorē
kļūdu. |
Atsākšanas etiķete |
Izpilde tiek atsākta no jūsu norādītās etiķetes . |
Tālāk sniegtajā piemērā tiek izmantots priekšraksts Resume pēc kļūdas rašanās:
Sub EnterSquareRoot6()
Dim Num kā variants
Dim Msg As String
Dim Ans kā vesels skaitlis
Mēģini vēlreiz:
Iestatiet kļūdu apstrādi
Par kļūdu GoTo BadEntry
Pieprasīt vērtību
Skaitlis = InputBox (“Ievadiet vērtību”)
Ja Cipars = ““ Tad izejiet no apakšpunkta
' Ievietojiet kvadrātsakni
ActiveCell.Value = kvadrāts(skaits)
Iziet Sub
BadEntry:
Msg = Err.Number & ": " & Error (Err.Number)
Msg = Msg & vbNewLine & vbNewLine
Msg = Ziņojums & "Pārliecinieties, vai ir atlasīts diapazons, "
Msg = Ziņojums & "lapa nav aizsargāta",
Msg = Msg & "un jūs ievadāt nenegatīvu vērtību."
Msg = Msg & vbNewLine & vbNewLine & "Vai mēģināt vēlreiz?"
Ans = MsgBox (Ziņojums, vbYesNo + vbCritical)
Ja Ans = vbYes, atsāciet mēģinājumu vēlreiz
Beigu apakš
Šai procedūrai ir cits apzīmējums: TryAgain. Ja rodas kļūda, izpilde turpinās ar BadEntry etiķeti, un kods parāda tālāk redzamo ziņojumu. Ja lietotājs atbild, noklikšķinot uz Jā, tiek aktivizēts paziņojums Atsākt un izpilde tiek atgriezta uz marķējumu TryAgain. Ja lietotājs noklikšķina uz Nē, procedūra beidzas.
Ja rodas kļūda, lietotājs var izlemt, vai mēģināt vēlreiz.
Ņemiet vērā, ka kļūdas ziņojumā ir iekļauts arī kļūdas numurs, kā arī “oficiālais” kļūdas apraksts.
Paziņojums Resume izdzēš kļūdas stāvokli pirms turpināt. Lai to redzētu, iepriekšējā piemērā mēģiniet aizstāt priekšrakstu, kas ir pirmais līdz pēdējam:
Ja Ans = vbYes, tad dodieties uz Mēģiniet vēlreiz
Kods nedarbojas pareizi, ja izmantojat GoTo, nevis Resume. Lai demonstrētu, ievadiet negatīvu skaitli. Jūs saņemat kļūdas uzvedni. Noklikšķiniet uz Jā, lai mēģinātu vēlreiz, un pēc tam ievadiet citu negatīvu skaitli. Šī otrā kļūda nav iesprostoti, jo netika notīrīts sākotnējais kļūdas stāvoklis.
Īsumā, apstrādājot kļūdu
Lai palīdzētu jums saglabāt visu šo kļūdu apstrādi, šeit ir ātrs un netīrs kopsavilkums. Kļūdu apstrādes koda blokam ir šādas īpašības:
-
Tas sākas tūlīt pēc etiķetes, kas norādīta paziņojumā On Error.
-
Tas ir jāsasniedz jūsu makro tikai tad, ja rodas kļūda. Tas nozīmē, ka tieši pirms etiķetes ir jāizmanto priekšraksts, piemēram, Exit Sub vai Exit Function.
-
Tam var būt nepieciešams CV paziņojums. Ja izvēlaties nepārtraukt procedūru, kad rodas kļūda, pirms atgriešanās pie galvenā koda ir jāizpilda priekšraksts Resume.
Zinot, kad ignorēt kļūdas
Dažos gadījumos ir pilnīgi pareizi kļūdas ignorēt. Tieši tad stājas spēkā paziņojums On Error Resume Next.
Nākamajā piemērā tiek veikta katra atlasītā diapazona šūna un vērtība tiek pārvērsta tās kvadrātsaknē. Šī procedūra ģenerē kļūdas ziņojumu, ja kādā atlases šūnā ir negatīvs skaitlis vai teksts:
Sub SelectionSqrt()
Aptumšot šūnu kā diapazonu
Ja TypeName(Atlase) <> “Diapazons”, tad izejiet no apakšdaļas
Katrai atlasītajai šūnai
šūna.Vērtība = Sqr(šūna.vērtība)
Nākamā šūna
Beigu apakš
Šādā gadījumā, iespējams, vēlēsities vienkārši izlaist jebkuru šūnu, kurā ir vērtība, kuru nevar pārvērst kvadrātsaknē. Varat izveidot visu veidu kļūdu pārbaudes iespējas, izmantojot If-Then struktūras, taču varat izstrādāt labāku (un vienkāršāku) risinājumu, vienkārši ignorējot radušās kļūdas.
To panāk, izmantojot paziņojumu par kļūdu, atsākt nākamo:
Sub SelectionSqrt()
Aptumšot šūnu kā diapazonu
Ja TypeName(Atlase) <> “Diapazons”, tad izejiet no apakšdaļas
Kļūdas gadījumā atsākt nākamo
Katrai atlasītajai šūnai
šūna.Vērtība = Sqr(šūna.vērtība)
Nākamā šūna
Beigu apakš
Parasti varat izmantot paziņojumu On Error Resume Next, ja uzskatāt, ka kļūdas ir nekaitīgas vai nav saistītas ar jūsu uzdevumu.