为什么CDate(“0/5/14”)返回5/14/2000?

在Excel 2010 VBA中,我正在testing以确保我的代码正确处理了无效的用户input。 我正在使用CDate来validationdateinput。 我发现无效dateinput“0/5/14”,CDate返回date5/14/2000。

这是一个CDate错误,或者我错过了什么? 在Excel工作表单元格中,“0/5/14”不计算为date。

同样,Excel VBA中的Year(“0/5/14”)返回2000,而Excel工作表单元格中的Year(“0/5/14”)返回错误。

Windows区域设置是英语美国,所以月/日/年是标准。

CDate函数(以及DateValue等其他string函数)检查date的string表示forms,并尝试将其与任何已知date格式进行匹配,并将其视为有效的date,除非无法匹配已知的格式。 由于可以将年数表示为1位或更多位数,所以inputstring“0/5/14”可以被认为是年/月/日格式,因此返回“2000年5月14日”以您当地的date格式。

CDateDateValue之间的区别在于CDate可以接受一个数字,而DateValue则不能。 两者都首先使用个人电脑的短date格式,而不是那些使用en-US设置的人。 如果提供的string不适合第一次尝试,则这两个函数都会回到其他date格式。

你如何处理这种情况取决于你。 在你的情况下,2000年的date可能会超出范围,所以你可以在这个基础上拒绝。 如果你想坚持“mm / dd / yyyy”格式,你可以编写你自己的parsing器代码。

我相信@BorjaGüilesQuintana有正确的答案,基本上是it's reading it as YY/MM/DDCDate不作为工作表函数存在,所以我不觉得表单(而不是VBA)的解释不同(不是第一次,例如TRIM)。

任何年份(以及哪一部分代表年份可能取决于系统)都是根据规则(可能取决于版本)来解释的,但是对于Excel 2013而言,两位数字的值在本世纪的29停止 – 即30被解释为19 30。 在这里的更多细节。