如何检查Access VBA中的Excel时间值?

我正在使用Access VBA处理Excel工作簿(请参阅从Access读取Excel工作簿 ),现在我要检查单元是否包含有效的时间值。 对于date我使用IsDate(),它工作正常。

但与时间值它不(因为没有IsTime()我也使用IsDate()的时间值)。 或者我应该使用IsNumeric因为时间值被存储为双打?

使用“12:00:00”(带空格)IsDate()给出TRUE(!?),但Excel自身不会将其识别为时间值,VBAdebugging程序还将其显示为文本string。

使用“12:00:00”IsDate()给出FALSE,但Excel本身将其识别为时间值,VBAdebugging器将显示值0,5。

任何人?

更新9/12:

感谢@belisarius和@ mwolfe02我发现这是我的情况:

/* 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 (eg with leading space as in above example) */ IsDate() = True, IsNumeric() = False, TypeName() = String 

所以我只需要检查TypeName()返回DoubleIsNumeric() True并避免与'正常'数值的混淆,如果该值是> = 0和<1。

有两个不同的概念:

1)date和时间格式

当您在Excel中格式化单元格以包含date(和/或)时间时,Excel使用内部表示forms。 根据MS:
默认情况下,1900年1月1日是序列号1,而2008年1月1日是序列号39448,因为它是1900年1月1日后的39,448天.Macintosh Excel对于Macintosh使用不同的date系统作为其默认值。 序号中小数点右边的数字表示时间; 左边的数字代表date。 例如,序列号.5代表中午12:00。

就是这样。 date和时间以十进制数字forms存储。

2)VBA 可以转换成date/时间的东西

这是IsDate检查的内容。 根据MS:

返回一个布尔值,指示expression式是否可以转换为date。
IsDate返回的True并不意味着单元格已被格式化为Date / Time,它只是告诉您可以将此值转换为date/时间。 但更糟的是:函数可能为不同的平台返回不同的值: 在Microsoft Windows中,有效date范围是公元100年1月1日至公元9999年12月31日; 这些范围因操作系统而异。

什么是明确的是,Excel没有validation单元格的内容作为date/时间。 几乎可以确定一个文本包含用户input的任何字符(如你的例子中的空格)。 IsDate()返回告诉你VBA不能将值转换为date,但是如果你知道格式(为转换写一个ad-hoc函数),也许你可以。

HTH!

编辑我认为这个问题的答案也可以帮助你。