isDate-Funktion in VBA Excel

Mitteilung an Interessierte
Ich habe mich mit der isDate-Abfrage herumgeplagt und merkwürdige Resultate bekommen, z.B.
isDATE(„29.09.05“) = true
isDATE(„31.09.05“) = true !!! kann ja nicht sein, aber eine genauere Analyse zeigte, dass isDATE von MS wieder einmal besonders schlau konstruiert wurde, nämlich es interpretiert mein Datum einfach als 9. Mai 1931 !!
Ich sehe nun 3 Möglichkeiten, entweder ich verlange immer eine vierstellige Jahresangabe (so habe ich es jetzt gemacht und das geht natürlich) oder ich schreibe selber eine richtige isDATUM-Funktion oder - noch viel besser - jemand anderer hat dies schon gemacht.
???
Erich

Hallo Erich,

eine Variante wäre, das Datum das isDate als gültig markiert hat einfach noch einmal von VBA formatieren zu lassen (z.B. nach dd.mm.yy) und dann das so formatierte Datum mit dem Eingebenen zu vergleichen.

Das könnte ungefähr so aussehen (der Formatstring muss natürlich an das jeweilige zu verwendende Format angepasst werden, in der untenstehenden Fassung wäre z.B. 20.02.2005 falsch, da das Datum nur 2-stellig erwartet wird):

Function CheckDate(dateToCheck As String) As Boolean Dim converted As Date If IsDate(dateToCheck) Then converted = CDate(dateToCheck) If Format(converted, „dd.mm.yy“) = dateToCheck Then CheckDate = True Else CheckDate = False End If Else CheckDate = False End IfEnd Function

Gruß
Daniel

PS: Du hast übrigens noch eine Variante vergessen: auch ? IsDate(„02.20.2005“) = True denn hier wird das Format mm.dd.yyyy angenommen.

Hallo Daniel
Vorerst vielen Dank für die Anregungen.

Function CheckDate(dateToCheck As String) As Boolean Dim
converted As Date If IsDate(dateToCheck) Then
converted = CDate(dateToCheck) If Format(converted,
„dd.mm.yy“) = dateToCheck Then CheckDate = True
Else CheckDate = False End If Else
CheckDate = False End IfEnd Function

Interessante Idee, das werde ich austesten, aber eigentlich gefällt mir diese „Hintertüt-Methode“ doch nicht so ganz.
Frage: Gibt es im VBA keine Methode, um das Format aus dem Excel-Blatt auszulesen? Dann wäre die Sache ja gelöst.
Vielleicht weiss das auch jemand!
Erich

Hallo Daniel
Dein Makro läuft prima, aber man müsste eigentlich ALLE möglichen Formatangaben einzeln abfragen, wie z.B.
10/01/2005
1-10-2005
usw. usw.
Da gibt es ja jede Menge Formate! Ich habe viel mehr Formate gefunden im Internet als ich mir je vorgestellt habe. Ich verstehe jetzt auch die Warnung vor der unübersichtlichen Funktion isDATE besser, die ich in einem Buch gelesen hatte.
Deine Antwort hat mich dann aber zu folgendem angeregt:

Option Explicit
Dim dat As Double
Sub DatumTest()
'wenn Zelle A1 kein Datum enthält, entsteht Fehler
On Error GoTo Fehler
 'wenn Datum drin, kann man rechnen wie mit Zahl
 dat = Range("A1").Value + 1
 'wenn A1 leer ist, wird dat=1; das muss man abfangen
 If dat = 1 Then GoTo Fehler
 'Ziel erreicht
 MsgBox (dat & " ist ein gültiger Datumswert")
 Exit Sub
Fehler:
MsgBox ("Diese Zelle hat nicht Datumformat")
End Sub

Das scheint mir eine sehr einfache und globale Lösung zu sein. Habe ich wohl etwas übersehen?

Es freut sich über Kommentare/Kritik
Erich

Hallo Erich,

Dein Makro läuft prima, aber man müsste eigentlich ALLE
möglichen Formatangaben einzeln abfragen, wie z.B.
10/01/2005
1-10-2005
usw. usw.

Das war in meinem speziellen Fall einer der Hintergedanken, da nur 2 bestimmte Formate zulässig sein sollten. Wenn du alle irgenwie gültigen Datumsformate zulassen willst, willst du ja isDate nicht einschränken sondern sogar eher erweitern, also in die andere Richtung gehen.

Da gibt es ja jede Menge Formate! Ich habe viel mehr Formate
gefunden im Internet als ich mir je vorgestellt habe.

Die Frage die sich mir da stellt ist, willst du die wirklich alle zulassen / prüfen?

Sub DatumTest()
[…]
Das scheint mir eine sehr einfache und globale Lösung zu sein.

Wenn diese Lösung das bietet was du suchst, klar. Für meinen Geschmack wäre der Umfang der gültigen Daten etwas zu gross: klar kann man die Eingabe der Zahl 44 in ein Datum umwandeln, dennoch würde ich in den meisten Fällen diese Eingabe als ungültig zurückweisen.

Gruß
Daniel

Hallo Daniel

irgenwie gültigen Datumsformate zulassen willst, willst du ja
isDate nicht einschränken sondern sogar eher erweitern, also
in die andere Richtung gehen.

JA

Die Frage die sich mir da stellt ist, willst du die wirklich
alle zulassen / prüfen?

JA

Wenn diese Lösung das bietet was du suchst, klar. Für meinen
Geschmack wäre der Umfang der gültigen Daten etwas zu gross:
klar kann man die Eingabe der Zahl 44 in ein Datum umwandeln,
dennoch würde ich in den meisten Fällen diese Eingabe als
ungültig zurückweisen.

Auch hier ein JA!
Mein Makro war wohl nicht so toll.
Ich habe es verbessert. Meine Idee ist, alle Einträge, die in irgend einem Format ein Datum sein können, will ich erfassen. Meine neue Version erkennt also 44 nicht als Datum, aber auch nicht den String '29.02.05
Der Fall von '29.02.05 und ähnlichen war ja, was mich störte, weil Excel daraus eigenmächtig/besserwisserisch ein Datum macht mit „passenden“ Werten, nänlich 2. Mai 1929 etc…
Mein Makro fängt dies nun ab, indem wohl isDate=true wird, jedoch die Addition fehlschlägt!
Allerdings lehnt es auch den String '06.10.2005 ab, aber das ist gar nicht so schlecht, die Benutzer sollen das Datum richtig eingeben!
Was meinst du dazu? Jage ich etwa einem Phantom nach? Erneuter Kommentar wäre mir hilfreich.

Dim dat As Double
Dim ist As Boolean
Sub isDatum()
On Error GoTo Fehler
 If IsDate(Range("A1")) = True Then
 'dies ergibt TRUE für einen string, der wie ein Datum aussieht
 dat = Range("A1").Value + 1
 'deshalb eine arithmetische Operation, die den string "entlarvt"
 If dat = 1 Then GoTo Fehler
 'dat wird =1, wenn der Inhalt als NULL erkannt wird
 Datum
 Else
 GoTo Fehler
 End If
Exit Sub
Fehler:
 NoDatum
End Sub

Private Sub Datum()
 MsgBox (dat - 1 & " ist ein gültiger Datumswert")
End Sub
Private Sub NoDatum()
 MsgBox ("Dies ist kein Datum")
End Sub

Beste Grüsse
Erich