Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1704to1708
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prüfung Datum

Prüfung Datum
07.08.2019 11:02:21
Peter
Hallo,
mit den folgenden Daten prüfe ich ob die TextBox1 das richtige Datum enthält.
'Anfang alles Textbox1
'gibt bei Wechsel Punkt nach Tag und Monat ein Begrenzung auf 10 Stellen für Datum
<pre>Private Sub TextBox1_Change()
If TextBox1 = "" = True Then Exit Sub
'Anfang Datum . Vorgabe und Begrenzung auf 10 Stellen
If TextBox1.Tag = "1" = True Then Exit Sub
If Len(TextBox1) = 2 Then
If InStr(TextBox1, ".") = 0 Then TextBox1 = TextBox1 & "."
ElseIf Len(TextBox1) = 5 Then
If Len(TextBox1) - Len(Application.Substitute(TextBox1, ".", "")) < 2 Then
TextBox1 = TextBox1 & "."
End If
End If
TextBox1.MaxLength = 10
'Ende Datum . Vorgabe und Begrenzung auf 10 Stellen
End Sub</pre>
'Function wird ausgeführt in Textbox1_BeforeUpdate
Function Check_Datum(Tb As MSForms.TextBox) As Boolean
If IsDate(Tb.Text) Then
Tb.Text = CDate(Tb.Text)
If Tb.Text Like "##.##.####" Then Exit Function
End If
MsgBox "Eingabe nicht korrekt!"
Check_Datum = True 'springt wieder ins Feld
Tb.SelStart = 0
Tb.SelLength = Len(Tb.Text)
End Function</pre>
<pre>Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Cancel = Check_Datum(TextBox1) 'True --> springt wieder ins Feld 'Check_Datum = o.a. Function
End Sub</pre>
Wenn das Datum richtig ist, ist alles o.k.. Wenn jedoch z.B. das Datum wie folgt eingegeben wird: 01..01.201 dann kommt MsgBox "Eingabe nicht korrekt" aber der Fokus wird nicht in der TextBox1 gesetzt bzw. der Text markiert.
Könnt ihr mir bitte mitteilen, wo der Fehler liegt.
Besten Dank
Gruss
Peter

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prüfung Datum
07.08.2019 17:16:14
onur
Schreibe den Code aus Textbox1_BeforeUpdate stattdessen in Before_Exit und setze, wenn falsche Eingabe
Cancel=True

AW: Prüfung Datum
07.08.2019 20:08:58
Peter
Hallo Onur,
besten Dank, werde ich morgen testen.
Gruss
Peter
AW: Prüfung Datum
08.08.2019 05:42:01
Hajo_Zi
offen bedeutet es soll noch eine Antwort kommen.
Warum ist dein Beitrag Offen.
Du willst doch was machen. Soll jemand vorbei kommen?

AW: Prüfung Datum
08.08.2019 07:35:09
Peter
Hallo Hajo,
ich wusste dies nicht - ein Fehler von mir.
Gruss
Peter
AW: Prüfung Datum
09.08.2019 07:28:46
Peter
Hallo Onur,
leider hat es so nicht funktioniert. Ich habe aber im Archiv gesucht und habe eine neue Lösung gefunden.
Meine Lösung ergibt nun, dass Tag 2-stellig, Monat 2-stellig und Jahr 4-stellig eingegeben wird. Erfolgt eine teilweise Eingabe und es wird Tab gedrückt(Textbox1 verlassen)wird "Datum eintragen" in TB1 einge-fügt.
Desweiteren wird geprüft, ob die Anzahl bei Tage und Monat richtig ist. Ebenso ob das Jahr noch gültig ist also aktuelle Jahr und vorher oder nach dem aktuellen Jahr. Sind diese Fehler zutreffend wird in TB1 eingetragen "Datum ist falsch".
Für Testzwecke ist eine Userform mit TextBox1 und TextBox2 und ein Commandbutton zum Beenden, sowie ein Commandbutton für Daten übertragen notwendig.
In ein allgemeines Modul wird nachstehendes eingefügt:
'Allgemeines Modul
Option Explicit
Public dblDatWert As Double
<pre>Public Function DatOK(varWert As String, Stellen_Jahr As Integer, Optional Zukunftsfähig As Boolean) As Boolean
' by Peter W
'Eingabeformat 16.11.05 / TT.MM.JJ = DD.MM.YY = Stellen_Jahr 2
'Eingabeformat 16.11.2005 / TT.MM.JJJJ = DD.MM.YYYY = Stellen_Jahr 4
'Zukunftsfähig --> wenn False das Datum darf nicht größer als Heute sein
Dim intlen As Integer, intMon As Integer, intDay As Integer, intYear As Integer
Select Case Stellen_Jahr
Case 2: intlen = 8
Case 4: intlen = 10
End Select
If Len(varWert) > intlen Or Len(varWert) < intlen Then _
GoTo FalschesDatum
If Mid(varWert, 3, 1) <> "." Or Mid(varWert, 6, 1) <> "." Then _
GoTo FalschesDatum
intMon = Mid(varWert, 4, 2) * 1
intDay = Left(varWert, 2) * 1
If Not IsNumeric(intDay) Or Not IsNumeric(intMon) _
Then GoTo FalschesDatum
If Stellen_Jahr = 2 Then
intYear = ("20" & Right(varWert, 2)) * 1
If Not IsNumeric(intYear) Then _
GoTo FalschesDatum
ElseIf Stellen_Jahr = 4 Then
intYear = Right(varWert, 4) * 1
If Not IsNumeric(intYear) Then _
GoTo FalschesDatum
End If
dblDatWert = DateSerial(intYear, intMon, intDay)
Select Case intMon
Case 1, 3, 5, 7, 8, 10, 12
If intDay > 31 Then _
GoTo FalschesDatum
Case 4, 6, 9, 11
If intDay > 30 Then _
GoTo FalschesDatum
Case 2
If intDay > 28 Then
If Month(dblDatWert) <> intMon Then _
GoTo FalschesDatum
End If
Case Else
GoTo FalschesDatum
End Select
If Zukunftsfähig = False Then
If dblDatWert > Date Then _
GoTo FalschesDatum
End If
DatOK = True
Exit Function
FalschesDatum:
DatOK = False
'''MsgBox "falsches Datum"
End Function</pre>
~f~
Und für die Userform sind nachstehende Daten erforderlich:
~f~
Option Explicit
<pre>Private Sub CommandButton1_Click()
MsgBox "Makro Daten übertragen ausführen"
End Sub</pre>
<pre>Private Sub CommandButton2_Click()
Unload Me
End Sub</pre>
'prüft die richtige Eingabe von Datum und benötigt hierzu das u. a. Makro: <pre>Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'weiterhin wird das Datum auf Tag, Monat und Jahr überprüft und benötigt hierzu die Function in Modul2: _
<pre>Public Function DatOK(varWert As String, Stellen_Jahr As Integer, Optional Zukunftsfähig As Boolean) As Boolean
<pre>Private Sub TextBox1_Change()
'Anfang Prüfung Textbox-Eingabe Tag-2Stellen und ".", Monat-2Stellen und "." und Jahr-4Stellen
If Me.TextBox1 = "" Then Exit Sub 'wenn TextBox leer, dann Ende
If Me.TextBox1.Tag = "1" Then Exit Sub
If Len(Me.TextBox1) = 2 Then
If InStr(Me.TextBox1, ".") = 0 Then Me.TextBox1 = Me.TextBox1 & "."
ElseIf Len(Me.TextBox1) = 5 Then
If Len(Me.TextBox1) - Len(Application.Substitute(Me.TextBox1, ".", "")) < 2 Then
Me.TextBox1 = Me.TextBox1 & "."
End If
End If
Me.TextBox1.MaxLength = 10
'Ende Prüfung Textbox-Eingabe Tag-2Stellen und ".", Monat-2Stellen und "." und Jahr-4Stellen
If Len(Me.TextBox1) = 10 Then 'prüft die Länge TB1, wenn 10 dann gehe zu TB6
Me.TextBox2.SetFocus
Me.TextBox2.SelStart = 0
Me.TextBox2.SelLength = Len(Me.TextBox2)
'Anfang prüft, ob Datum richtig ist
' CommandButton1 = True
If DatOK(TextBox1, 4) = True Then 'MsgBox dblDatWert
'' MsgBox "Datum liegt nicht in Zukunft" 'wird nicht benötigt, da Datum richtig ist
Me.TextBox2.SetFocus
Me.TextBox2.SelStart = 0
Me.TextBox2.SelLength = Len(Me.TextBox2)
ElseIf DatOK(TextBox1, 4) = False Then 'MsgBox dblDatWert
' MsgBox "Datum liegt in Zukunft"
Me.TextBox1 = "Datum ist falsch"
Me.TextBox1.SetFocus
Me.TextBox1.SelStart = 0 'markiert den Text
Me.TextBox1.SelLength = Len(Me.TextBox1) 'markiert den Text
End If
'Ende prüft, ob Datum richtig ist
End If
End Sub</pre>
'benötigt für die Prüfung, ob Datum richtig eingegeben wurde entsprechend dem Makro: <pre>Private Sub TextBox1_Change
'ohne diesem Makro geht das Makro: <pre>Private Sub TextBox1_Change nicht
<pre>Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Text Like "##.##.####" Then Exit Sub
If Not TextBox1.Text Like "##.##.####" Then
TextBox1 = "Bitte Datum eintragen"
Cancel = True
Me.TextBox1.SetFocus
Me.TextBox1.SelStart = 0 'markiert den Text
Me.TextBox1.SelLength = Len(Me.TextBox1) 'markiert den Text
End If
End Sub</pre>
Bei mir funktioniert es sowohl im Test als auch im Orginalprogramm.
Gruss
Peter
Anzeige
.habe aber im Archiv gesucht-warum nicht gleich?
09.08.2019 16:05:39
robert

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige