CDate()的行为不一致

时间:2015-04-30 12:52:15

标签: vba excel-vba excel

Windows中的区域设置为MM/DD/YYYY

现在看看这两行,以及MONTH中的变化:

Sub DateBug()
    Debug.Print Format(CDate("11/4/1999"), "MMMM D, YYYY")
    Debug.Print Format(CDate("30/4/1999"), "MMMM D, YYYY")
End Sub

输出:

November 4, 1999
April 30, 1999

太好了,对吧?到底是怎么回事?

在第二行,我想要一个错误,而不是“猜测”。

这是一个错误吗?知道如何规避这个吗?

Excel 2007,2010,2013中的相同

2 个答案:

答案 0 :(得分:1)

不是错误。如果可以,VB将使用默认区域设置将字符串转换为日期文字。它在第一次约会时做了什么。但是在第二个日期,这会给出一个无效的日期,所以它尝试了DD / MM / YYYY,这很有效。解决方案,使用日期文字而不是字符串。在两个日期文字周围添加#符号(例如:'#4/30/1999#')以忽略区域设置并强制使用MM / DD / YYYY格式。 '#30/4/1999#'会给你你想要的错误。这将使您的代码独立于计算机的区域设置 - 即,它将无论如何都可以工作。或者使用DateTime(1999,4,30,0,0,0)。看这里...... Date Data Type (Visual Basic)

在Excel中,您将使用不带单引号的文字:

Sub Macro1()
Range("D2").Select
ActiveCell.FormulaR1C1 = CDate(#4/30/1999#)
End Sub

答案 1 :(得分:1)

这不是一个错误,它是一个"功能"

enter image description here

CDate()将根据固定规则解释字符串。如果日期有效,则为m / d / y,将返回该日期。如果日期无效为m / d / y,但有效为d / m / y,那么将返回该日期。如果日期无效为m / d / y或d / m / y,则会返回错误。

Sub dural()
    Dim st As String
    st = CStr(CDate("12/4/2012")) & vbCrLf & CStr(CDate("13/4/2012"))
    MsgBox st
End Sub