VBA 中的 Date 类型的匹配问题

作者: , 共 643 字 , 共阅读 0

VBA 的 Date 类型比较奇怪。

测试:

1. 新建一个空白的 Excel 文档,在 A1 单元格输入 2009-11-12。

2. 打开 VBA 编辑器,插入模块,增加下面这个宏

Sub test()
    MsgBox #11/12/2009# = Range("A1").Value ' true
    MsgBox VarType(#11/12/2009#) = VarType(Range("A1").Value) ' true
    MsgBox Application.WorksheetFunction.Match(#11/12/2009#, Range("A1"), 0) ' error
End Sub

3. 按 F5 运行 test 宏,可以看到 Range("A1")的类型和值都和#11/12/2009#一致(通过对 range("A1")的监视也可以看出这一点),都是 Date 类型,但是如果用 match 去匹配的话,却出现错误。

解决方法,在匹配中将要匹配的 Date 类型的数据强制转换成 Long 类型去匹配。

MsgBox Application.WorksheetFunction.Match(CLng(#11/12/2009#), Range("A1"), 0)

对其原理还是不清楚,不知道有没有看到的高手来做一下解释。

Q. E. D.

类似文章:
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
相似度: 0.199
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
编程 » Excel, lotus, VBA
公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:
编程 » Excel, VBA
某些时候需要打开 Excel 文件来获取或者写入数据,但又不希望跳出打开的 Excel 文件窗口,可以用下面的代码:
编程 » Excel, VBA
最近学到一招,效果不错~
2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库
编程 » VBA, Excel
如果不提供错误处理方法,VBA在出错时会停留在出错之处。Excel/VBA 提供On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
编程 » Excel, 数据库
在前面的文章里,我已经提到Excel 数据本身可以当做一张 SQL 查询的数据表,并在 Excel 内进行数据库运算操作。数据库查询函数可以用我之前写的Excel 数据库操作函数类。我们可以用以下方式
编程 » Excel, VBA
效果图:
在工作中定期或不定期会收到一些数据文件,然后要将它们的附件保存到自己的电脑上,下面演示如何让 Outlook 自动做这件事情。
编程 » Oracle, VBA, 数据库
最近写一个 vba 程序的时候不间歇的出现 「存取器不是参数存取器 」或者「列值被截断」的错误。后来发现对于我等不专业人士,遇到这样的错误还挺 e 的。下面是综合各种资料了解到的一些东西。
时间管理中有重要的一条,保持你的收件箱整洁、干净。Gmail 一个重要的创新就是 Archive (存档),选中邮件后点下「archive」按钮或者按一下快捷键 y ,邮件就被移出收件箱,但又跟删除邮件不一样,这些邮件还可以继续被搜索。这里讲最近写的如何在 Outlook 里实现这个功能。