2010-12-02 3 views
1

Ich verarbeite eine Excel-Arbeitsmappe mit Access VBA (siehe Reading an Excel workbook from Access) und jetzt möchte ich überprüfen, ob eine Zelle einen gültigen Zeitwert enthält. Für Daten benutze ich IsDate() und es funktioniert gut.Wie überprüft man Excel-Zeitwerte in Access VBA?

Aber mit Zeitwerten nicht (da es keine IsTime() gibt, verwende ich auch IsDate() für Zeitwerte). Oder sollte ich IsNumeric verwenden, da die Zeitwerte doppelt gespeichert werden?

Mit "12:00:00" (mit Leerzeichen) gibt IsDate() TRUE (!?), Aber Excel selbst erkennt es nicht als Zeitwert, der VBA-Debugger zeigt es auch als Textzeichenfolge an.

Mit "12:00:00" IsDate() gibt FALSE aber Excel selbst erkennen es als Zeitwert, der VBA-Debugger zeigt den Wert 0,5.

Jeder?

UPDATE 12.09:

Dank @belisarius und @ mwolfe02 fand ich das für meine Situation:

/* Valid time value */ 
IsDate() = False, 
IsNumeric() = True, 
TypeName() = Double 

/* Numeric (no time) value */ 
IsDate() = False, 
IsNumeric() = True, 
TypeName() = Double 

/* Valid date value */ 
IsDate() = True, 
IsNumeric() = False, 
TypeName() = Date 

/* Invalid time value (e.g. with leading space as in above example) */ 
IsDate() = True, 
IsNumeric() = False, 
TypeName() = String 

So überprüfen muss ich nur, wenn TypeName() kehrt Double und IsNumeric() True und Verwirrung vermeiden mit 'normalen' numerischen Werten, wenn der Wert> = 0 ist und < 1. Richtig?

Antwort

4

Es gibt zwei unterschiedliche Konzepte:

1) Datum & Zeitformat

Wenn Sie formatieren eine Zelle in Excel Datum enthalten (und/oder) Zeit, Excel eine interne Darstellung verwendet. Nach MS:
Standardmäßig ist 1. Januar 1900 Seriennummer 1, und 1. Januar 2008 ist Seriennummer 39448, da es nach dem 1. Januar 1900 39.448 Tage ist. Microsoft Excel für den Macintosh verwendet ein anderes Datumssystem als sein Standardwert. Die Zahlen rechts von dem Komma in der Seriennummer stehen für die Zeit; Zahlen auf der linken Seite stellen das Datum dar. Zum Beispiel repräsentiert die Seriennummer .5 die Uhrzeit 12:00 Uhr mittags.

Und das ist es. Datum und Uhrzeit werden als Dezimalzahlen gespeichert.

2) Dinge, die VBA zu einem Datum/Zeit

Dies ist, was Kontrollen ISDATE umwandeln könnte. Nach MS:

Gibt einen booleschen Wert zurück, der angibt, ob ein Ausdruck in ein Datum konvertiert werden kann.
Ein von IsDate zurückgegebenes True bedeutet nicht, dass eine Zelle als Datum/Uhrzeit formatiert wurde. Sie zeigt lediglich an, dass Sie den Wert in ein Datum/eine Uhrzeit umwandeln können. Aber schlimmer: Die Funktion kann verschiedene Werte für verschiedene Plattformen zurückgeben: In Microsoft Windows ist der Bereich der gültigen Daten 1. Januar, 100 A. bis 31. Dezember 9999 A. D.; Die Bereiche variieren zwischen den Betriebssystemen.

Es ist klar, dass Excel den Inhalt der Zelle nicht als Datum/Uhrzeit validiert hat.Es ist fast sicher, dass ein Text alle Zeichen enthält, die der Benutzer eingegeben hat (als Platz in Ihrem Beispiel). Die IsDate() Rückgabe sagt Ihnen, dass VBA nicht in der Lage ist, den Wert in ein Datum zu konvertieren, aber vielleicht können Sie, wenn Sie das Format kennen (und eine Ad-hoc-Funktion für die Konvertierung schreiben).

HTH!

bearbeiten Ich denke, die Antwort auf this question auch Ihnen helfen kann.

+0

Danke für Ihre umfassende Antwort. Ich verstehe das Problem immer noch nicht vollständig, aber für meine Situation habe ich die richtigen Informationen (denke ich), ich werde meine Ergebnisse als Antwort auf meine Frage hinzufügen – waanders