如何在 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() 是否返回DoubleIsNumeric() 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 时间值?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Access VBA 正确访问 Excel 文件

从 Excel VBA 的 MS Access 表单中获取价值

从 Access VBA 编辑打开的 Excel 工作表

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

使用 VBA 将 Access 查询链接到 Excel [重复]

如何从 VBA Access 中勾选 Excel 复选框