Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Fehlerroutine funktioniert nicht 100%

Begonnen von herb54, August 13, 2018, 12:24:02

⏪ vorheriges - nächstes ⏩

herb54

Hallo ich möchte eine Eingabe eines Datums über eine Fehlerroutine überprüfen! Das Ganze funktioniert jedoch noch nicht hundertprozentig. Manchmal steigt er doch aus und bringt einen Laufzeitfehler 13 "Typen unverträglich" . Und das obwohl ich diesen Fehler doch explizit abfange in der Routine:

Datummarke:

On Error GoTo Err_Report_Activate:

'Datumsabfrage wann die Anzahlung geleistet wurde
dt = InputBox("Wann wurde die Anzahlung geleistet? (z.B. 12.06.2017):")

'Anzahlungsdatum dem ungebundenen Berichtsfeld zuweisen
Me!txtDatum = dt
End If

Err_Report_Activate:

Select Case Err.Number

Case 13 'Typen unverträglich
    MsgBox "Es wurde ein falsches Datumsformat eingegeben!", vbInformation, Fehlerhafte_Eingabe
    GoTo Datummarke
    End Select
    MsgBox "Es wurde ein falsches Datumsformat eingegeben!", vbInformation, Fehlerhafte_Eingabe
    GoTo Datummarke
End Sub

Wie gesagt: Ein paarmal geht es und er zeigt mir in der MsgBox den Fehler an und manchmal kommt dann Laufzeitfehler 13. Hier ist dann auch meine zweite Frage:
Wenn der Laufzeitfehler kommt könnte ein Anwender über "Debuggen" in den VBA Code. Das wollte ich unbedingt verhindern. Gibt es da (außer der Fehlerroutine) noch eine Möglichkeit dies zu unterdrücken??

Im Voraus vielen Dank!
Herbert

Lachtaube

Über die Schönheit einer InputBox kann man geteilter Meinung sein.Private Sub MeineDatumseingabe()

   Const Frage As String = "Wann wurde die Anzahlung geleistet?" & _
         vbCrLf & "(z.B. 12.06.2017 oder auch 12.6 für das laufende Jahr):"

   Dim Antwort As String

   Do
      Antwort = InputBox(Frage, "Datum eintragen")
      If StrPtr(Antwort) = 0 Then Exit Sub           'Abbruch
   Loop Until IsDate(Antwort)
   
   'Me.txtDatum = cdate(Antwort)
   
   'zum Testen
   MsgBox CDate(Antwort)
End Sub
Grüße von der (⌒▽⌒)

MzKlMu

Hallo,
das Anzahlungsdatum ist doch bestimmt auch in einer Tabelle gespeichert.
Dann könnte man auf einem Formular das gewünschte Anzahlungsdatum über ein Kombifeld auswählen.
Das Kombi bezieht dann seine Datum aus der Tabelle mit dem Anzahlungsdatum.
Dann ist es ausgeschlossen dass man ein falsches Datum eingeben kann und der Code zum Prüfen entfällt ersatzlos.
Gruß Klaus

herb54

Die Lösung von Lachtaube funktioniert einwandfrei. Ich habe den Code noch mal kommentiert
falls jemand Interesse daran hat:
Private Sub Befehl169_Click()
Const Frage As String = "Wann wurde die Anzahlung geleistet?" & _
         vbCrLf & "(z.B. 12.06.2017 oder auch 12.6 für das laufende Jahr):"

   Dim Antwort As String

   Do
      Antwort = InputBox(Frage, "Datum eintragen")
     
      'Abfrage ob "Abbrechen" geklickt wurde
      If StrPtr(Antwort) = 0 Then Exit Sub           ' wird true wenn man "Abbrechen" klickt
   
   'Schleife solange ausführen bis IsDate(Antwort) ein Datum ergibt
    Loop Until IsDate(Antwort)
   
   
   'Me.txtDatum = cdate(Antwort)
   
   'Umwandlung der Stringvariablen Antwort in ein Datum mit CDate
    MsgBox CDate(Antwort)
   
    End Sub

Es handelt sich hier bei dem Datumabfragefeld um ein ungebundenes Textfeld welches nicht in einer Tabelle enthalten ist und in einem Bericht enthalten ist, der nur Text enthält außer diesem einen Feld!
Vielen Dank an alle!
Herbert

Beaker s.a.

Sollte das nicht eher so aussehen?
    MsgBox CDate(Antwort)    'auskommentieren ('), da nur Kontrolle

    'Umwandlung der Stringvariablen Antwort in ein Datum mit CDate
    Me.txtDatum = cdate(Antwort)    'KEIN Kommentar sondern die IMO entscheidende Code-Zeile
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

herb54

Ja, stimmt! Habe ich auch so gemacht!