在Excel 2010 VBA中,我正在测试以确保我的代码正确处理无效的用户输入。我使用CDate来验证日期输入。我发现无效日期输入" 0/5/14",CDate返回日期为5/14/2000。
这是一个CDate错误,还是我错过了什么?在Excel工作表单元格中," 0/5/14"不评估日期。
同样,Excel VBA中的Year(" 0/5/14")返回2000,而Excel工作表单元格中的= Year(" 0/5/14")返回错误。
Windows区域设置为英语美国,因此月/日/年是标准。
答案 0 :(得分:3)
CDate
函数(以及其他字符串到日期函数,例如DateValue
)检查日期的字符串表示,并尝试将其与任何已知日期格式匹配,将其视为有效日期除非不能与任何已知格式相匹配。由于年份可以表示为1位或更多位数,因此输入字符串" 0/5/14"可以认为是年/月/日格式,因此它返回" 2000年5月14日"以您的本地日期格式。
CDate
和DateValue
之间的区别在于CDate
可以接受数字,而DateValue
则不能。两者都首先使用PC的短日期格式 - 而不是那些使用en-US设置的人。如果提供的字符串在第一次尝试时不适合,则这两个函数都会回退到其他日期格式。
由您决定如何处理此类情况。很可能在你的情况下,2000年的日期将超出范围,所以你可以在此基础上拒绝它。如果你想坚持" mm / dd / yyyy"格式,您可以编写自己的解析器代码。
答案 1 :(得分:1)
我相信@BorjaGüilesQuintana基本上it's reading it as YY/MM/DD
有正确答案。 CDate
不作为工作表函数存在,因此表格(与VBA相对)解释不同(不是第一次,例如TRIM)并不让我感到惊讶。
任何年份(以及哪个部分代表年份可能取决于系统)都会根据规则(可能取决于版本)进行解释,但对于Excel 2013和两位数值,这些在本世纪停留在29
- 即30
被解释为 19 30.有关here的详细信息。