Avatar billede per2edb Ekspert
18. maj 2021 - 19:38 Der er 13 kommentarer og
1 løsning

Program stop efter Error handling

Jeg har en Error Handling  der viser fejlkoden og efterfølgende dette:

  MsgBox FormName & " Lukkes pga fejl", vbInformation, "OBS"
  DoCmd.Close acForm, FormName

Jeg vil gerne have lukket formen og stoppet programforløbet efter fejlen
Jeg har prøvet med alt inklusiv STOP men det er ofte umuligt at undgå gentagne fejlkald

Har i et bud på hvordan programforløbet stoppes
Avatar billede MSchlamovitz Mester
18. maj 2021 - 22:17 #1
"Exit sub" hopper ud af igangværende procedure
"DoCmd.quit" - hvis du vil lukke Access
Avatar billede Gustav Ekspert
19. maj 2021 - 11:45 #2
End stopper al kode:

MsgBox FormName & " Lukkes pga fejl", vbInformation, "OBS"
DoCmd.Close acForm, FormName
End
Avatar billede per2edb Ekspert
19. maj 2021 - 13:20 #3
Desværre er det ikke så simpelt
Jeg er nok nød til at specificere hvad jeg ønsker:

Når der opstår en kodefejl kaldes  Error Handling
Her vises fejl koden
Alt det har jeg brugt i 10 år - ingen problem
Det nye kommer her:
Efter Fejlvisningen vil jeg have programmet stoppet i programforløbet (Her kan STOP bruges) men herefter ønsker jeg programmer går videre automatisk forfra til start af formen eller menuen

Det sker ikke nu. STOP standser i koderne og brugere bliver forvirrede
Avatar billede Gustav Ekspert
19. maj 2021 - 13:43 #4
Først:
> Jeg vil gerne have lukket formen og stoppet programforløbet efter fejlen

Det er, hvad End gør.

Nu:
>herefter ønsker jeg programmer går videre automatisk forfra til start af formen eller menuen

Stop indsætter en pause på kodeniveau. Hvis du ønsker noget tilsvarende på brugerniveau, er det MsgBox, som du allerede har.

Så løsningen er at tilrette din kode efter MsgBox til at gøre det, du ønsker - angiveligt start af formen eller menuen, men da du lukker formularen efter MsgBox, er det lidt uklart, hvad der skal ske.
Avatar billede per2edb Ekspert
19. maj 2021 - 15:14 #5
Nemlig - Ja her ligger humlen
Hvordan løser man det????
Hvad gør andre når der er en fejl.
Lader man dem bare stå inde i koderne?

Jeg kan se en kludeløsning i retning af en timer der startes og kalder formen efter STOP men det er noget makværk
Avatar billede Gustav Ekspert
19. maj 2021 - 16:30 #6
Du inkluderer fejlhåndtering i din funktion. Her er et gammelt eksempel:

Public Function ConvRTFtoText( _
  ByVal strRTF As String, _
  Optional booSingleRun As Boolean) _
  As String

' Converts RTF formatted string to plain text using RTF ActiveX control.
' When finished, Rich Text object is removed if booSingleRun is True.
'
' 2001-05-27. Cactus Data ApS, CPH.
 
  Static objRTF As Object
  Static booErr As Boolean
  Dim strText  As String
 
  On Error GoTo Err_ConvRTFtoText
 
  If objRTF Is Nothing Then
    Set objRTF = CreateObject("RICHTEXT.RichtextCtrl")
  End If
 
  With objRTF
    .TextRTF = strRTF
    strText = .Text
  End With
 
  If booSingleRun = True Then
    Set objRTF = Nothing
  End If
 
  ConvRTFtoText = strText
 
Exit_ConvRTFtoText:
  Exit Function

Err_ConvRTFtoText:
  If booErr = False Then
    MsgBox "Error " & Err.Number & ". " & Err.Description & "!", _
          vbExclamation + vbOKOnly, _
          "Rich Text converter"
    ' Only show error message once per session.
    booErr = True
  End If
  Resume Exit_ConvRTFtoText
 
End Function
Avatar billede per2edb Ekspert
19. maj 2021 - 17:55 #7
Jeg er ikke med

Hvor og hvordan kaldes funktionen efter en fejl er opstået?
Avatar billede Gustav Ekspert
19. maj 2021 - 22:37 #8
Du bygger fejlhåndteringen ind i din nuværende funktion.

Ved [i]Err_DinFunktion[/] indsætter du, hvad der skal ske, hvis funktionen fejler. Kan programmet køre videre på en meningsfuld måde, så gør det; hvis ikke, så luk Access ned på en pæn måde.
Avatar billede per2edb Ekspert
20. maj 2021 - 08:49 #9
Jeg er helt lost
Jeg ville blive utrolig glad hvis du vilde  "puttede det ind i min Error_Handling sub:

Public Sub Error_Handling()

Dim a As String, X As String, Y As String, Z As String, E As String, d As String

    a = "Fejl art og sted:"
    X = "Form:                          " & FormName
    Y = "Sub Form:                    " & strSubFrm
    Z = "Fejl Kode for Placering  " & code
    E = "Fejl Art:                          " & Err.Number
    d = "Fejl Beskrivelse:            " & Err.Description

    MsgBox a & Chr(10) & Chr(10) & X & Chr(10) & Y & Chr(10) & Z & Chr(10) & E & Chr(10) & d, vbCritical, "Fejlmeddelelse / Error"
       
    If MsgBox("Vil du Fortsætte [Ja] eller Start forfra [Nej] ?", vbYesNo + vbQuestion, "Spørgsmål!") = vbYes Then
       
            Stop  <======= Herefter skal der fortsættes automatisk ????
            DoCmd.OpenForm "zzzz"

  Else
            Stop  <======= Herefter skal der fortsættes automatisk ????

          DoCmd.Close acForm, "xxx"
          DoCmd.OpenForm "yyyy"
   
End If
Avatar billede Gustav Ekspert
20. maj 2021 - 12:14 #10
Der er ikke én måde at gøre dette på. Det afhænger helt af applikationen og fx, om den overhovedet kan køre videre efter fejlen. Her er en måde:

Public Sub ErrorMessage( _
    ByVal FunctionName As String, _
    ByVal FormName As String, _
    ByVal SubformName As String, _
    ByVal Number As Long, _
    ByVal Description As String)

    Const Title    As String = "Fejlmeddelelse/Error"
   
    Dim Prompt      As String
    Dim Buttons    As VbMsgBoxResult

    Prompt = _
        "Fejl i funktion: " & FunctionName & vbCrLf & _
        "Formular: " & FormName & vbCrLf & _
        "Underformular: " & SubformName & vbCrLf & _
        "Fejlkode: " & CStr(Number) & vbCrLf & _
        "Fejlbeskrivelse: " & Description
    Buttons = vbCritical + vbOkOnly
    MsgBox Prompt, Buttons, Title

    Prompt = "Vil du Fortsætte [Ja] eller starte forfra [Nej]?"
    Buttons = vbQuestion + vbYesNo   
    If MsgBox(Prompt, Buttons, Title) = vbYes Then     
        ' Fortsæt.
    Else
        ' Afslut.
        DoCmd.Quit acQuitSaveNone
    End If

End Sub


Public Function ConvRTFtoText( _
    ByVal strRTF As String, _
    Optional booSingleRun As Boolean) _
    As String

    Static objRTF  As Object
    Dim strText    As String

    On Error GoTo Err_ConvRTFtoText

    If objRTF Is Nothing Then
        Set objRTF = CreateObject("RICHTEXT.RichtextCtrl")
    End If

    With objRTF
        .TextRTF = strRTF
        strText = .Text
    End With

    If booSingleRun = True Then
        Set objRTF = Nothing
    End If

    ConvRTFtoText = strText

Exit_ConvRTFtoText:
    Exit Function

Err_ConvRTFtoText:
    ErrorMessage "ConvRTFtoText", Me.Name, "", Err.Number, Err.Description
    Resume Exit_ConvRTFtoText

End Function


Her er en udmærket introduktion til fejlhåndtering i VBA og dens mange aspekter:

https://www.automateexcel.com/vba/error-handling/
Avatar billede per2edb Ekspert
20. maj 2021 - 12:41 #11
Mange tak
Jeg prøver det
Avatar billede per2edb Ekspert
20. maj 2021 - 16:07 #12
Jeg kan ikke helt se nogen forbedring

Min  sub Sub ErrorMessage virker på samme måde som din
Jeg kan ikke se hvor Function ConvRTFtoText kommer ind i billedet?

Med de koder du har listet fortsætterprogrammet  efter en fejl fortsat med at liste følgefejl op
Det er det jeg ønsker standset
Første fejl er nok
Herefter skal der gås til en neutral form f.eks menuen
Avatar billede Gustav Ekspert
20. maj 2021 - 16:24 #13
Function ConvRTFtoText er jo bare et eksempel på implementering af fejlhåndtering i en funktion.

Hvordan det skal gøres i din aktuelle kode, kan jeg ikke gennemskue, da jeg intet ved om, hvad der sker i dit program. Og hvis programmet er stoppet helt på grund af en seriøs fejl, kan det ikke åbne nogen formular eller menupunkt - så lukker det ned uanset hvad.

Men studér linket, jeg postede - det kommer hele vejen rundt om brug af fejlhåndtering i VBA, godt nok i Excel, men det er det samme i Access.
Avatar billede Jørgen Kirkegaard Professor
31. maj 2021 - 21:19 #14
En lille kommentar: Hvis det i alle tilfælde af fejl er ok at lukke formen (close form) og derved automatisk gå "tilbage" til en menu, hvad forhindrer dig så i dét? Og hvis alt andet kikser, er der jo altid mulighed for at afslutte/genstarte Access efter en passende besked. Hvis programmet skal kunne håndtere forskellige fejltyper på forskellig måde, f.eks. hvis man skal skynde sig at lagre data (eller netop ikke lagre), er der nok kun "Gustavs" metode tilbage.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester