Neuigkeiten:

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

Mobiles Hauptmenü

Datum aus Textfeldfeld

Begonnen von Tom2002, November 21, 2018, 07:35:35

⏪ vorheriges - nächstes ⏩

Tom2002

Moin zusammen,

in einem Textfeld stehen Zahlen, Ja/Nein Werte, Datumsangaben oder auch einfach nur Text. Jetzt möchte ich gerne die Datumsangaben (liegen vor als 2018-11-24 oder 24.11.2018) rausfiltern. Dies prüfe ich mit


IsDate([AlterWert])
und Ausgabe
CDate([AlterWert])


Allerdings bekomme ich bei einigen Zahlenwerte Probleme
Z.B. wird


IsDate("4023,3") zeigt True
IsDate("403.2") zeigt True


als Datum erkannt und in


cdate("4023,3") => 01.03.4023
cdate("403.2") => 01.02.403


umgewandelt.

Wer weis rat?

LG
Tom
MS Access 2016, Office 365, Windows 10

markusxy

Zitat von: Tom2002 am November 21, 2018, 07:35:35
in einem Textfeld stehen Zahlen, Ja/Nein Werte, Datumsangaben oder auch einfach nur Text.

Warum ist das so?
Ich würde das ändern und damit Klarheit schaffen.
Ich würde z.B. niemals die Standard Inputbox (wobei ich die grundsätzlich nicht verwende) verwenden um ein Datum abzufragen.
Da bekommt der User ein Kalender Steuerelement - möglicherweise mit eingegrenztem Zeitraum - und damit ist ein gültiges Datum sichergestellt.

Lachtaube

Auf IsDate() ist kein Verlaß. Ich würde mich in so einem Fall eher auf einen Regulären Ausdruck verlassen.


Für ein Datum mit den Bindestrichen könnte man

^([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])$

verwenden und für deutsche Datumsangaben dann

^(3[01]|0[1-9]|[12][0-9])\.(1[0-2]|0[1-9])\.([0-9]{4})$

zusammengefasst:

^((([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9]))|((3[01]|0[1-9]|[12][0-9])\.(1[0-2]|0[1-9])\.([0-9]{4})))$

In VBA kann dann eine Prüfung auf diese Art geschen (Luftcode):
   Dim IstEinDatum As Boolean
   'Verweis auf: <Microsoft VBScript Regular Expressions 5.5> setzen
   Dim re As RegExp

   Set re = New RegExp
   re.Pattern = "^((([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9]))|" & _
                "((3[01]|0[1-9]|[12][0-9])\.(1[0-2]|0[1-9])\.([0-9]{4})))$"
   IstEinDatum = re.Test(DeinZuPruefenderText)
Grüße von der (⌒▽⌒)

Tom2002

Hallo Lachtaube,

perfekt, mit RegEx funktioniert es Bestens.

@Markus: Das hätte ich gerne so, aber manchmal ist es halt anders. :-)

LG

Tom
MS Access 2016, Office 365, Windows 10

PhilS

Zitat von: Tom2002 am November 21, 2018, 07:35:35
in einem Textfeld stehen Zahlen, Ja/Nein Werte, Datumsangaben oder auch einfach nur Text. Jetzt möchte ich gerne die Datumsangaben (liegen vor als 2018-11-24 oder 24.11.2018) rausfiltern.
Lachtaube hat schon eine super Lösung gepostet.

Darüber hinaus noch ein genereller Tipp, der nebenbei auch die meisten Inkarnationen deines Problem erschlagen sollte.
Bei einer Datumsvalidierung sollte man auch prüfen, ob das Datum im zulässigen Bereich liegt. So ist z.B. der 15.01.2108 zwar zweifelsfrei ein gültiges Datum, jedoch mit nahezu absoluter Sicherheit fachlich nicht korrekt, sondern ein trivialer Tippfehler.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor