die Excel-VBA IsDate-Funktion zu verstehen

VBA IsDate Funktion sagt Ihnen, angeblich, ob ein Text-String als Datum interpretiert werden kann. Zum Beispiel bewerten alle folgenden Ausdrücke True:

IsDate (# 147-5 / 25/2015, 148-) IsDate (# 147 Januar 16 # 148-) IsDate (# 147-12-1 # 148-) IsDate (# 147-12 / 1/15 # 148- ) IsDate (147-2 / 30 # 148-) IsDate (# # 147-30 / 2 # 148-)

In den letzten beiden Beispielen, feststellen, dass IsDate nicht wählerisch über die Reihenfolge der Tag und Monat ist. Beide Strings werden könnte als Datum interpretiert, so IsDate gibt True zurück (unabhängig von Ihrem System Datumsformat-Einstellungen).

Hier einige Informationen aus einem Microsoft Support-Artikel:

Die VBA-Datumsfunktionen IsDate, Format, CDate und CVDate eine Funktion in OLE-Automatisierung (OleAut32.dll) gefunden zu nutzen. Diese Funktion sucht alle möglichen Datumsformate von jedem der getrennten Werte in der Zeichenfolge, die das Datum und gibt einen Booleschen Wert Tokenerstellung angibt, ob der Eingang kann als Datum dargestellt werden.

Dies ist wichtig, sich daran zu erinnern, wenn die Funktion mit einem Datum zu interpretieren, die eine 2-stellige Jahr enthält. Verschiedene Locales verwenden verschiedene Datumsformate (dh, mm / tt / jj, yy / mm / dd, # 147-DD MMM YY# 148-, # 147-JJ MMM DD# 148-, und so weiter), und daher versucht, die Funktion die Ziffern in allen Positionen, bis die Funktion ein gültiges Datum oder erschöpft alle Möglichkeiten gefunden hat.

Nur weil IsDate eine Zeichenfolge erkennt als ein Datum, bedeutet nicht, dass die Zeichenfolge zuverlässig in ein Datum umgewandelt werden. In einigen Fällen ist das Ergebnis zweideutig. Zum Beispiel, was ist mit diesem Ausdruck?

IsDate (# 147-29-Feb-01 # 148-)

29. Februar 2001 ist kein gültiges Datum. Allerdings gibt dieser Ausdruck wahr, weil 1. Februar 1929 (und 2. Januar, 1929) sind gültige Daten. Und so sind die gleichen Daten im Jahr 2029.

Eine Suche nach IsDate Dokumentation kam leer. Basierend auf Tests akzeptiert IsDate eine der folgenden als Trennzeichen: einen Schrägstrich (/), einen Bindestrich (-), ein Komma (,), einen Punkt und einen Raum (.).

Daher sind alle die folgenden Ausdrücke zurückgeben True:

IsDate (# 147-5,1 # 148-) IsDate (# 147-30 6 # 148-) IsDate (# 147-30,6 # 148-) IsDate (# 147-1 / 2 # 148-)

Aber dann gibt es diese Anomalie: Die folgenden Ausdrücke gibt True zurück:

IsDate (# 147-5.1.5 # 148-) IsDate (# 147-5.1.05 # 148-)

Allerdings unausdrücklich, dieser Ausdruck ergibt Falsch:

IsDate (# 147-5.1.2005 # 148-)

Nehmen wir an, dass Sie ein Benutzerformular mit einem InputBox geschaffen, in dem der Benutzer ein Datum eingibt. Es sollte klar sein, dass IsDate mit der Eingabe zu bestätigen nicht sehr zuverlässig ist.

Die Dinge werden noch verwirrender, wenn man bedenkt, dass IsDate auch Zeitwerte abdeckt. (Es gibt keine entsprechenden IstUhrzeit Funktion.) Also, die folgenden Ausdrücke alle zurückgeben True:

IsDate (# 147-4: 45 # 148-) IsDate (# 147 bis 4,45 # 148-) IsDate (# 147-4 45 # 148-) IsDate (# 147-4 / 45 # 148-) IsDate (# 147- 23: 59 # 148-)

Diese Ausdrücke geben False:

IsDate (# 147-4: 60 # 148-) IsDate (# 147-24,45 # 148-)

Es ist wichtig, darauf hinzuweisen, dass IsDate nicht alle diese Macken aufweisen, wenn Sie ein Range-Argument übergeben. Beispielsweise:

IsDate (Range (# 147-A1 # 148-))

Es scheint, dass IsDate bei Identifizierung von Zellen, absolut zuverlässig ist, die ein Datum oder eine Zeit enthält. Es ist beispielsweise nicht, identifizieren eine Zelle, die 5.1 als ein Datum enthält. Wenn Ihr Code, ob eine Zeichenfolge zu bestimmen muss, kann als Datum interpretiert werden, die beste Lösung ist, dass die Zeichenfolge in eine Zelle zu bringen, und dann Code schreiben, den Zellinhalt zu überprüfen.

Menü