如何检查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()
返回Double
和IsNumeric() 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!
编辑我认为这个问题的答案也可以帮助你。