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中的相同
答案 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)
这不是一个错误,它是一个"功能"
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