VBA中的Date类型的匹配问题

作者:

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.

类似文章:
编程 » VBA, Excel
如果不提供错误处理方法, VBA在出错时会停留在出错之处。Excel/VBA 提供 On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
编程 » Excel, VBA
无意中发现一个 Excel VBA 对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
编程 » Excel, VBA
最近学到一招,效果不错~
编程 » Oracle, VBA, 数据库
最近写一个 vba 程序的时候不间歇的出现 「存取器不是参数存取器 」或者「列值被截断」的错误。后来发现对于我等不专业人士,遇到这样的错误还挺 e 的。下面是综合各种资料了解到的一些东西。
时间管理中有重要的一条, 保持你的收件箱整洁、干净 。Gmail 一个重要的创新就是 Archive (存档),选中邮件后点下「archive」按钮或者按一下快捷键 y ,邮件就被移出收件箱,但又跟删除邮件不一样,这些邮件还可以继续被搜索。这里讲最近写的如何在 Outlook 里实现这个功能。