Innehållsförteckning:
Video: HUR ANVÄNDER MAN?! 2024
När du behöver hantera fel i Excel VBA kan du använda OnError-satsen. Det finns dock några saker du behöver veta först. Du kan använda On Error-satsen på tre sätt.
Syntax | Vad det gör |
---|---|
Om Error GoTo label | Efter utförandet av detta uttalande återupptar VBA utförandet i
-sagnet efter den angivna etiketten. Du måste inkludera ett kolon efter etiketten så att VBA känner igen det som en etikett. |
På Error GoTo 0 | Efter att ha utfört detta uttalande återupptar VBA sitt normala
felkontroll beteende. Använd detta uttalande efter att du använt ett av de andra felmeddelandena eller när du vill ta bort felhantering i din procedur. |
Om felet fortsätter Nästa | Efter att ha utfört detta uttalande ignorerar VBA helt enkelt alla fel
och återupptas utförande med nästa uttalande. |
Återuppta efter ett fel
I vissa fall vill du helt enkelt att rutinen slutar graciöst när ett fel uppstår. Du kan till exempel visa ett meddelande som beskriver felet och avsluta proceduren. (Det tidigare EnterSquareRoot5-exemplet använder denna teknik.) I andra fall vill du återhämta sig från felet om möjligt.
För att återhämta sig från ett fel måste du använda ett CV-meddelande. Detta rensar felet och låter dig fortsätta exekvera på någon plats. Du kan använda CV-påståendet på tre sätt.
Syntax | Vad det gör |
---|---|
Fortsätt | Exekveringen återupptas med det uttalande som orsakade felet. Använd
detta om din felhanteringskod korrigerar problemet och det är okej att fortsätta. |
Fortsätt Nästa | Exekveringen återupptas med uttalandet omedelbart efter det uttalande
som orsakade felet. Detta ignorerar väsentligen felet . |
Fortsätt etikett | Exekvering återupptas på etiketten du anger. |
Följande exempel använder ett CV-meddelande efter ett fel:
Sub EnterSquareRoot6 () Dim Num Som variant Dim Msg Som String Dim Ans Som Integer TryAgain: 'Konfigurera felhantering På Error GoTo BadEntry "Prompten för ett värde Num = InputBox (" Ange ett värde ") Om Num =" "Avsluta sedan" Sätt in kvadratroten ActiveCell. Värde = Sqr (Num) Exit Sub BadEntry: Msg = Err. Nummer & ":" & Fel (Err.nummer) Msg = Msg & vbNewLine & vbNewLine Msg = Msg & "Kontrollera att ett intervall är markerat," Msg = Msg & "arket är inte skyddat," Msg = Msg & " du anger ett nonnegative värde. "Msg = Msg & vbNewLine & vbNewLine &" Försök igen? "Ans = MsgBox (Msg, vbYesNo + vbCritical) Om Ans = vbYes Fortsätt sedan TryAgain End Sub
Den här proceduren har en annan etikett: TryAgain.Om ett fel uppstår fortsätter körningen på BadEntry-etiketten och koden visar meddelandet nedan. Om användaren svarar genom att klicka på Ja, slår genomsökningsuppsättningen in och körningen springer tillbaka till TryAgain-etiketten. Om användaren klickar på Nej avslutas proceduren.
Om ett fel uppstår kan användaren bestämma om det ska försökas igen.Observera att felmeddelandet också innehåller felnumret tillsammans med den "officiella" felbeskrivningen.
I återupptappningen raderas felet innan du fortsätter. För att se detta, försök att ersätta följande uttalande för det näst sista tillägget i föregående exempel:
Om Ans = vbYes Then GoTo TryAgain
Koden fungerar inte korrekt om du använder GoTo istället för Fortsätt. För att visa, ange ett negativt tal. Du får felmeddelandet. Klicka på Ja för att försöka igen och ange sedan ett annat negativt tal. Det här andra felet är inte fastnat eftersom det ursprungliga felet inte var rensat.
Felhantering i ett nötskal
För att hjälpa dig att hålla hela den här felhanteringsaffären rakt, här är en snabb och smutsig sammanfattning. Ett block med felhanteringskod har följande egenskaper:
-
Den börjar omedelbart efter etiketten som anges i felmeddelandet.
-
Det bör endast nås med ditt makro om ett fel uppstår. Det innebär att du måste använda ett uttalande som Exit Sub eller Exit Function direkt före etiketten.
-
Det kan kräva ett CV-uttalande. Om du väljer att inte avbryta proceduren när ett fel inträffar måste du utföra ett CV-meddelande innan du återgår till huvudkoden.
Att veta när man ska ignorera fel
I vissa fall är det helt okej att ignorera fel. Det är då på felet fortsätt nästa uttalande kommer till spel.
Följande exempel loopar genom varje cell i det valda området och omvandlar värdet till dess kvadratrots. Denna procedur alstrar ett felmeddelande om någon cell i urvalet innehåller ett negativt tal eller en text:
Sub SelectionSqrt () Dimcell som Range If TypeName (Selection) <> "range", sedan Avsluta del för varje cell i markeringscell. Värde = Sqr (cellvärde) Nästa cell Slut Sub
I det här fallet kan du helt enkelt hoppa över en cell som innehåller ett värde som du inte kan konvertera till en kvadratrots. Du kan skapa alla möjliga felkontrollfunktioner genom att använda If-Then-strukturer, men du kan utforma en bättre (och enklare) lösning genom att helt enkelt ignorera de fel som uppstår.
Följande rutin uppnår detta genom att använda On Error Resume Next-satsen:
Sub SelectionSqrt () Dimelcell Som Område Om Typnamn (Urval) <> "Område" Då Avsluta Del Vid Fel Fortsätt Nästa För Varje Cell I Val cell. Värde = Sqr (cellvärde) Nästa cell Slut Sub
I allmänhet kan du använda ett On Error Resume Next-meddelande om du anser att felen är ofarlig eller oavsiktlig för din uppgift.