Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 为什么CDate(“0/5/14”)返回2000年5月14日?_Vba_Excel_Excel 2010 - Fatal编程技术网

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

Vba 为什么CDate(“0/5/14”)返回2000年5月14日?,vba,excel,excel-2010,Vba,Excel,Excel 2010,在Excel2010VBA中,我正在测试以确保我的代码正确处理无效的用户输入。我正在使用CDate验证日期输入。我发现,对于无效的日期输入“0/5/14”,CDate返回的日期是2000年5月14日 这是CDate错误,还是我遗漏了什么?在Excel工作表单元格中,“0/5/14”不会计算为日期 类似地,Excel VBA中的Year(“0/5/14”)返回2000,而Excel工作表单元格中的=Year(“0/5/14”)返回错误 Windows区域设置为英国-美国,因此月/日/年是标准的。我

在Excel2010VBA中,我正在测试以确保我的代码正确处理无效的用户输入。我正在使用CDate验证日期输入。我发现,对于无效的日期输入“0/5/14”,CDate返回的日期是2000年5月14日

这是CDate错误,还是我遗漏了什么?在Excel工作表单元格中,“0/5/14”不会计算为日期

类似地,Excel VBA中的Year(“0/5/14”)返回2000,而Excel工作表单元格中的=Year(“0/5/14”)返回错误


Windows区域设置为英国-美国,因此月/日/年是标准的。

我相信@Borja Güiles Quintana的答案基本上是正确的
,读作YY/MM/DD
CDate
不作为工作表函数存在,因此工作表(与VBA相反)的解释不同(这不是第一次,例如TRIM)也就不足为奇了


任何年份(代表年份的部分可能取决于系统)都会根据规则(可能取决于版本)进行解释,但对于本世纪的Excel 2013和两位数值,它们停在
29
——即
30
被解释为1930。更多细节。

我相信@Borja Güiles Quintana的答案基本上是正确的
,读作YY/MM/DD
CDate
不作为工作表函数存在,因此工作表(与VBA相反)的解释不同(这不是第一次,例如TRIM)也就不足为奇了


任何年份(代表年份的部分可能取决于系统)都会根据规则(可能取决于版本)进行解释,但对于本世纪的Excel 2013和两位数值,它们停在
29
——即
30
被解释为1930。更多细节。

函数
CDate
和其他字符串到日期的函数,如
DateValue
)检查日期的字符串表示形式,并尝试将其与任何已知日期格式匹配,认为它是有效日期,除非无法使其与任何已知格式匹配。由于年份可以表示为1个或多个数字,因此可以将输入字符串“0/5/14”视为年/月/日格式,因此它以本地日期格式返回“2000年5月14日”

CDate
DateValue
之间的区别在于
CDate
可以接受一个数字,而
DateValue
不能。两者都首先使用电脑的短日期格式——这对使用en-US设置的人来说并不重要。如果提供的字符串在第一次尝试时不适合,则这两个函数都会返回到其他日期格式


这取决于你如何处理这种情况。很可能在你的情况下,2000年的某个日期超出了范围,因此你可以据此拒绝它。如果您想坚持“mm/dd/yyyy”格式,您可以编写自己的解析器代码。

CDate函数(以及其他字符串到日期的函数,如
DateValue
)检查日期的字符串表示形式,并尝试将其与任何已知的日期格式匹配,将其视为有效日期,除非无法使其与任何已知格式匹配。由于年份可以表示为1个或多个数字,因此可以将输入字符串“0/5/14”视为年/月/日格式,因此它以本地日期格式返回“2000年5月14日”

CDate
DateValue
之间的区别在于
CDate
可以接受一个数字,而
DateValue
不能。两者都首先使用电脑的短日期格式——这对使用en-US设置的人来说并不重要。如果提供的字符串在第一次尝试时不适合,则这两个函数都会返回到其他日期格式


这取决于你如何处理这种情况。很可能在你的情况下,2000年的某个日期超出了范围,因此你可以据此拒绝它。如果您想坚持使用“mm/dd/yyyy”格式,您可以编写自己的解析器代码。

Excel显然将0视为2000年起的第0年。无法解释原因,但为了协助错误处理,可能需要检查位数。如果字符串中少于6个,则返回给用户。可能最好使用三个单独的控件,这样您就可以在每一步进行验证,而不是试图解析或解释错误的击键/etc.,并捕获由此产生的错误。我意识到
IsDate
超出了问题定义的范围,但这里有难以置信的详细记录,可能会为您提供更好的验证:Excel清楚地将0视为2000年的0年。无法解释原因,但为了协助错误处理,可能需要检查位数。如果字符串中少于6个,则返回给用户。可能最好使用三个单独的控件,这样您就可以在每一步进行验证,而不是试图解析或解释错误的击键/etc.,并捕获由此产生的错误。我意识到
IsDate
超出了问题定义的范围,但它在这里被记录得非常详细,可能会为您提供更好的验证:CDate不会首先尝试使用US格式,而是使用您的系统设置。与DateValue不同的是,CDate将接受一个代表有效日期值的数字。谢谢,@Rory,你说得对。我编辑了我的答案以反映这一点。CDate不会首先尝试使用US格式-它使用您的系统设置。与DateValue不同的是,CDate将接受一个代表有效日期值的数字。谢谢,@Rory,你说得对。我编辑了我的答案以反映这一点。