如何在 Access VBA 中检查 Excel 时间值?
Posted
技术标签:
【中文标题】如何在 Access VBA 中检查 Excel 时间值?【英文标题】:How to check Excel time values in Access VBA? 【发布时间】:2011-05-19 04:22:26 【问题描述】:我正在使用 Access VBA 处理 Excel 工作簿(请参阅Reading an Excel workbook from Access),现在我想检查一个单元格是否包含有效的时间值。对于日期,我使用 IsDate() 并且效果很好。
但是对于时间值,它不会(因为没有 IsTime() 我也使用 IsDate() 作为时间值)。还是应该使用 IsNumeric,因为时间值存储为双精度值?
使用“12:00:00”(带空格)IsDate() 给出 TRUE (!?) 但 Excel 本身无法将其识别为时间值,VBA 调试器还将其显示为文本字符串。
使用 "12:00:00" IsDate() 给出 FALSE 但 Excel 本身将其识别为时间值,VBA 调试器显示值 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 (e.g. with leading space as in above example) */
IsDate() = True,
IsNumeric() = False,
TypeName() = String
所以我只需要检查TypeName()
是否返回Double
和IsNumeric() True
并避免与“正常”数值混淆(如果该值是>= 0 和
【问题讨论】:
【参考方案1】:有两个不同的概念:
1) 日期和时间格式
当您在 Excel 中格式化单元格以包含日期(和/或)时间时,Excel 使用内部表示。根据 MS:默认情况下,1900 年 1 月 1 日是序列号 1,而 2008 年 1 月 1 日是序列号 39448,因为它是 1900 年 1 月 1 日之后的 39,448 天。用于 Macintosh 的 Microsoft Excel 使用不同的日期系统作为其默认值。 序号小数点右边的数字代表时间;左边的数字代表日期。例如,序列号 0.5 代表时间中午 12:00。
就是这样。日期和时间存储为十进制数字。
2) VBA 可以转换为日期/时间的事物
这是 IsDate 检查的内容。根据 MS:
返回一个布尔值,指示表达式是否可以转换为日期。 IsDate 返回的 True 并不意味着单元格已被格式化为日期/时间,它只是告诉您可以将此值转换为日期/时间。但更糟糕的是:该函数可能针对不同的平台返回不同的值:在 Microsoft Windows 中,有效日期的范围是公元 100 年 1 月 1 日至公元 9999 年 12 月 31 日;范围因操作系统而异。
很明显,Excel 没有将单元格的内容验证为日期/时间。几乎可以肯定包含用户输入的任何字符的文本(如示例中的空格)。 IsDate() 返回告诉您 VBA 无法将值转换为日期,但如果您知道格式(并为转换编写临时函数),也许您可以.
HTH!
编辑 我认为this question 的答案也可能对您有所帮助。
【讨论】:
感谢您的全面回答。我仍然不完全理解这个问题,但对于我的情况,我得到了正确的信息(我认为),我会将我的发现添加为我的问题的答案以上是关于如何在 Access VBA 中检查 Excel 时间值?的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel VBA 的 MS Access 表单中获取价值
在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA