Generell
felhantering i
|
|
On Error GoTo
Felhantering Kill stFilnamn ExitHere: Exit Sub Felhantering: MsgBox "Filen kan inte hittas!", vbInformation Resume ExitHere End Sub |
Det som är
viktigt att
komma ihåg
är att ange
Exit Sub
före
felhanteringsrutinen
annars
aktiveras
den varje
gång
proceduren
körs och att
felhanteringsrutinen
placeras
sist i
proceduren.
Generellt
gäller att
det endast
ska finnas
en "exit" i
en
sub-procedur
eller
funktion. I
exemplet
övergår
kontrollen
till
huvudkoden
genom "Resume
ExitHere"
efter
det att
felhanteringsrutinen
har körts.
On Error
Resume Next
Nackdelen
med
"On Error
GoTo Label"
är att den
kan kräva
mycket kod
för även
mindre
åtgärder.
Vissa fel
kan vara av
den typ att
det inte
krävs någon
åtgärd från
eller
information
till
användaren.
Här kan då
"On Error
Resume Next"
komma till
pass.
Den instruerar VBA att hoppa över (ignorera) den felande delen av koden och exekvera nästa rad utan någon åtgärd:
|
On
Error Resume Next Kill stFilnamn |
On Error
Goto 0
Varje
gång
någon av
de två
ovanstående
händelserna
exekveras
så är
dessa
aktiva
till
dess att
en annan
felhanteringsrutin
initieras
eller
den
aktuella
rutinen
stoppas.
För att avsluta egna felhanteringsrutinerna och återställa de inbyggda felhanteringsrutinerna används denna händelse:
|
On
Error
Resume
Next Kill stFilnamn On Error GoTo 0 |
Resume
Fyller
en
viktig
funktion
i det
att den
instruerar
VBA
att
återgå
till te
x raden
där
felet
uppstod
eller
någon
annan
plats i
koden
alternativt
fortsätta
exekveringen.
Den kan
användas
på
följande
tre
sätt:
Vilket
fel har
uppstått?
Genom
att
använda
oss av
ett
flertal
egenskaper
för
objektet
"Err"
kan
vi
erhålla
viktig
information
om felen
som
uppstår:
Genom
att
identifiera
vilken
typ av
fel som
uppstår
kan vi i
felhanteringen
också
styra
händelseförloppet.
Följande
kod
visar
tre
möjliga
scenarios:
|
Felhantering: Select Case Err.Number Case 70 kod... Case 71 kod... Case Else kod... End Select Resume ExitHere:
If
Err.Number
<> 0
Then...
If
Err.Number
= 71 Then... |
För en fullständig förteckning över felnummer se direkthjälpen.
Skapa
egna "felobjekt"
Istället
för att
förlita
oss på
de fel
som VBA
genererar
kan vi
skapa
egna "felobjekt",
vilka vi
kan ha
nytta av
när vi t
ex
skapar
egna
funktioner.
Egenskapen
"Raise"
tar tre
argument:
|
If
lnAntal
< 0 Or
lnAntal
> 100
Then Err.Raise 12345, "ProcedurNamn", _ "Argumentet måste vara mellan 1 och 100." End If |
Alternativt kan vi för egenskapade funktioner använda oss av CVErr-funktionen. Den ger oss bl a möjlighet att generera samma felmeddelanden som de inbyggda funktioner kan visa:
| Konstant | Felnummer |
Cellfelmeddelande |
| xlErrDiv0 | 2007 | #Division/0! |
| xlErrNA | 2042 | #Saknas! |
| xlErrName | 2029 | #Namn? |
| xlErrNull | 2000 | #Skärning! |
| xlErrNum | 2036 | #Ogiltigt! |
| xlErrRef | 2023 | #Referens! |
| xlErrValue | 2015 | #Värdefel! |
Funktionen kan användas på följande sätt och därmed styra vilket felmeddelande som ska visas:
|
If Err.Number <> 0 Then FÖRFATTARE = CVErr(xlErrNA) |
Alternativ
felhantering
Istället
för att
som ovan
använda
oss av
händelsen
"On
Error"
kan vi
hantera
fel på
andra
sätt.
Ett flertal av "IS"-funktionerna är inte explicit funktioner för felhantering utan snarast för validering men kan komma till pass även i detta sammanhang:
| Om variabeln inte är
numeriskt If Not IsNumeric(lnTal) Then...
'Om variabeln är tom 'Om variabeln saknar data 'Om variabeln är datum 'Om argument saknas
'Om
argument är
fel |
Använd inte
Globala
variabler
En felkälla
som vi med
fördel ska
undvika så
långt det är
möjligt är
Globala
variabler.
Dessa kan bl
a innehålla
skilda
värden i
olika moment
och därmed
vid
användning
ge upphov
till fel.
Denna typ av
fel är
synnerligen
svåra att
hantera.
Avslutningsvis
rekommenderas
att, precis
som med
övrig kod,
även hålla
felhanteringsrutinerna
så enkla som
möjligt.