IT Fjernundervisning

Fejlhåndtering

Beskrivelse

Fejlhåndtering

Det er ikke alle fejl i vores programmer, der opstår fordi vi selv har lavet en fejl i vores kode. Nogle fejl kan opstå f.eks. fordi brugeren har glemt at sætte en diskette i drevet, som vi gerne vil gemme noget på. Sådan en fejl vil få vores program til at gå ned med en fejlkode, som brugeren kan have svært ved at forstå og vi kan ikke være sikre på, at der faktisk er blevet gemt noget på disketten. Til at fange den slags fejl har vi "on error" metoden. Den virker sådan her:

On Error GoTo LineLabel

Som vist i dette lille eksempel, som du kan prøve at kopiere ind i et modul og teste

 

Sub AktiverNytArk On Error GoTo ErrHandler:     Worksheets("NytArk").Activate      Exit Sub  ErrHandler:     If Err.Number = 9 Then         MsgBox "Arket findes ikke!"         ' Arket findes ikke, så vi opretter det         Worksheets.Add.Name = "NytArk"         ' Retur til den linje, hvor fejlen opstod         Resume     End If End Sub

Og et mere:

Sub GemTilA()   On Error GoTo ErrorTrap   ChDrive "A"   MyFile = "A:\Data.XLS"   Application.DisplayAlerts = False   ActiveWorkBook.SaveAs FileName:=MyFile   Exit Sub Rydop:     MsgBox "Der er ikke blevet gemt noget på disketten fordi brugeren har trykket på annuller"   Exit Sub  ErrorTrap:    Besked = "Fejl nr: = " & Err.Number & vbCr & _             Err.Description & vbCr & vbCr & _             "Indsæt en diskette i drevet og tryk ok "    Svar = MsgBox(Besked, vbQuestion + vbOKCancel, "Error")    If Svar = vbCancel Then Resume Rydop    Resume End Sub

Vi har som du ser et par muligheder for at genoptage afviklingen af koden

  • Resume - genoptager afviklingen med den linje der gav fejlen
  • Resume Next - genoptager afviklingen lige efter den linje der gav fejl
  • Resume LinieLabel - genoptager afviklingen ved den label vi har angivet

Du kan også vælge "On Error Resume Next", men det skal man nok lige overveje lidt...

Et eksempel på brug af On Error Resume Next

On Error Resume Next     N = 1 / 0    ' Skab en fejl     If Err.Number <> 0 Then          N = 1     End If

 


 

Central fejlhåndtering

Et lille eksempel, som jeg håber du kan bruge

Sub MinMakro()   On Error Goto LokalFejl   ..   ..  RydOp:   Exit Sub  LokalFejl:   iHandling = Central("MinMakro", vbAbortRetryIgnore)   Select Case iHandling     Case vbAbort       Resume Rydop     Case vbRetry       Resume     Case vbIgnore       Resume Next   End Select End Sub  Function Central(stKalder As String, iKnapper As Integer) As Integer   Debug.Print stKalder, Err.Number, Err.Description   If bLogging Then Print #2, Now, stKalder, Err.Number   Select Case Err.Number     Case xx       Central = MsgBox("Der er et problem med ..." , iButtons, Title:=Application.Caption & ": " & stCaller)     Case ...   End Select End Function

Find en liste over fejlnumre her: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/trappable-errors

 


Øvelse

Opret et regneark med ovenstående eksempler (ikke den centrale fejlhåndtering, men eksemplerne over det), sørg for at det virker og send det til mig.

Implementer fejlhåndtering i de andre makroer du har skrevet - specielt dem, der gemmer eller henter dokumenter og send regnearkne til mig.

Brug for hjælp til VBA, VSTO eller SQL?

Scient Data tilbyder professionel IT-konsulentbistand

Kontakt Scient Data →