【问题标题】:Why does CDate("0/5/14") return 5/14/2000?为什么 CDate("0/5/14") 返回 5/14/2000?
【发布时间】:2023-03-26 21:28:01
【问题描述】:

在 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 区域设置为美国英语,因此月/日/年是标准设置。

【问题讨论】:

  • Excel 清楚地将 0 视为 2000 年的第 0 年。无法解释原因,但为了帮助处理错误,也许检查位数。如果字符串中少于 6 个,则返回给用户。
  • 最好使用三个单独的控件,这样您就可以在每个步骤中进行验证,而不是尝试解析或解释错误的击键等。并捕获由此产生的错误。
  • 我意识到 IsDate 超出了您的问题定义的范围,但它在此处以令人难以置信的详细信息进行了记录,并可能为您提供更好的验证:stackoverflow.com/questions/4338025/…

标签: vba excel excel-2010


【解决方案1】:

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

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

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

【讨论】:

  • CDate 不会首先尝试使用美国格式 - 它使用您的系统设置。但与 DateValue 不同的是,CDate 将接受一个表示有效日期值的 数字
  • 谢谢,@Rory,你说的很对。我已经编辑了我的答案以反映这一点。
【解决方案2】:

我相信@Borja Güiles Quintana 的正确答案基本上是it's reading it as YY/MM/DDCDate 不作为工作表函数存在,因此工作表(与 VBA 相对)解释不同(不会是第一次,例如 TRIM),这并不让我感到惊讶。

任何年份(代表年份的部分可能取决于系统)根据规则(可能取决于版本)进行解释,但对于 Excel 2013 和两位数值,这些值在本世纪的 29 处停止 - 即 @987654325 @ 被解释为19 30。更多细节here

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2014-03-31
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多