Alla VBA-fel skapas inte lika. Vissa är seriösa och vissa är mindre seriösa. Även om du kan ignorera fel som du anser vara oväsentliga, måste du hantera andra, mer allvarliga fel. I vissa fall måste du identifiera det specifika felet som uppstår.
Varje typ av fel har ett officiellt nummer. När ett fel uppstår lagrar Excel felnumret i ett Error-objekt med namnet Err. Objektets Number-egenskap innehåller felnumret och dess Description-egenskap innehåller en beskrivning av felet. Till exempel visar följande sats felnumret, ett kolon och en beskrivning av felet:
MsgBox Err.Number & ": " & Err.Description
Tänk på att Excel-felmeddelanden inte alltid är särskilt användbara - men det vet du redan.
Följande procedur visar hur man avgör vilket fel som uppstod. I det här fallet kan du säkert ignorera fel som orsakas av att du försöker få kvadratroten ur ett icke-positivt tal (det vill säga fel 5) eller fel som orsakas av att du försöker få kvadratroten ur ett icke-numeriskt värde (fel 13).
Å andra sidan måste du informera användaren om kalkylbladet är skyddat och urvalet innehåller en eller flera låsta celler. (Annars kan användaren tro att makrot fungerade när det verkligen inte gjorde det.) Ett försök att skriva till en låst cell i ett skyddat kalkylblad orsakar fel 1004.
Sub SelectionSqrt()
Dim cell som intervall
Dim ErrMsg As String
Om TypeName(Selection) <> "Range" Avsluta Sub
Vid fel GoTo ErrorHandler
För varje cell i urval
cell.Value = Sqr(cell.Value)
Nästa cell
Avsluta Sub
ErrorHandler:
Välj Case Err.Number
Fall 5 'Negativt tal
Fortsätt Nästa
Fall 13 'Typfel överensstämmer
Fortsätt Nästa
Fodral 1004 'Låst cell, skyddat ark
MsgBox "Cellen är låst. Försök igen.", vbCritical, cell.Address
Avsluta Sub
Case Else
ErrMsg = Error(Err.Number)
MsgBox "ERROR: " & ErrMsg, vbCritical, cell.Address
Avsluta Sub
Avsluta Välj
Avsluta Sub
När ett körtidsfel uppstår, hoppar körningen till koden som börjar vid ErrorHandler-etiketten. Strukturen Välj ärende testar för tre vanliga felnummer. Om felnumret är 5 eller 13, återupptas exekveringen vid nästa programsats. (Med andra ord, felet ignoreras.) Men om felnumret är 1004, ger rutinen information till användaren och avslutas sedan. Det sista fallet, en catch-all för oförutsedda fel, fångar alla andra fel och visar det faktiska felmeddelandet.