Excel 意外的CDate()行为

Excel 意外的CDate()行为,excel,vba,date,type-conversion,Excel,Vba,Date,Type Conversion,在浏览一些没有错误处理的旧代码时,我偶然发现了意外的行为 Sub Test() Dim userinput as Variant userinput = Application.Inputbox("Enter a date") 'userinput will be a Variant/String with the inputs below Debug.Print CDate(userinput) End Sub Input: "27/8", "27/08",

在浏览一些没有错误处理的旧代码时,我偶然发现了意外的行为

Sub Test()
    Dim userinput as Variant
    userinput = Application.Inputbox("Enter a date")
    'userinput will be a Variant/String with the inputs below
    Debug.Print CDate(userinput)
End Sub

Input: "27/8", "27/08", "27-8", "27-08", "27.8", "27.08"
Output: 27.08.2019 ' for all of the above

Input: "27.8.", "27.08."
Output: 04.10.1900, 31.05.1907
我期望
错误13:类型不匹配
,或
27.08.1900
27.08.2019
作为输出。
后两个输入发生了什么?我不能把我的头绕在它周围

Additional input: "26.8." -> output: 24.09.1900
Input: "26.08." -> output: 20.02.1907
区域设置为德国(Deutsch(Deutschland))
日期格式为
DD.MM.YYYY

编辑:
完整的userinput代码如下所示:

Sub Test()
    Dim userinput As Variant
    Dim cancelBool As Boolean
    Do While Not ((IsDate(userinput) And Not userinput = vbNullString) Or cancelBool)
        userinput = Application.InputBox("Enter a date")
        If userinput = False Then cancelBool = True
        'the following line was inspired by Plutian
        If Not IsDate(userinput) And IsNumeric(userinput) Then userinput = userinput & Year(Now())
    Loop
    If Not cancelBool Then Debug.Print CDate(userinput)
End Sub

这里的问题不在于cdate函数,因为当输入被格式化为字符串时,它给出了预期的行为,这是由于德国习惯将日期写为
dd.mm.
而造成的。 问题是如何处理此输入并仍然获得预期结果,这可以通过以下代码实现:

如果是数字(用户输入),则
其他的
userinput=CDate(userinput&Year(Now()))
如果结束
当变量未被识别为数字时,强制在用户输入中插入当前年份,这是由于以
结尾造成的。这是因为excel中的日期始终存储为数值。将年份添加到输出中会将其转换回cdate可以处理的数值,因为excel现在会将首选的分隔符识别为实际的分隔符,并按预期将其作为日期处理


对我来说,这将是强迫用户修改输入的首选替代方案。但是,如果要求的日期不在当前年份,则不起作用,并且可能会在新年前后引发问题。或者,您可以将年份片段替换为普通的“0”或您选择的任何年份。

这似乎不是CDate行为问题,只是一般问题中的文本到数字转换

我没有引用,但根据观察:当试图将文本转换为数值时,Excel将检查文本是否为明显的日期。如果不是,那么它将去掉任何千的分隔符——毫无疑问,还有当地货币符号和其他东西——尽可能将文本减少到一个数字

因此,在我的英语语言环境设置中:

“27.8”
“27,8”
)是可识别的十进制值 =27天和8/10过去
31/12/1899
=
26/01/1900 19:12:00

“27,8”
“27.8”
)是无法识别的十进制值,也不是可识别的日期 所以它变成了
“278”
,因为它去掉了000个分隔符(在我的设置中是逗号,在你的设置中是句点) 过去278天
31/12/1899
=
27/09/1900

然而,正如@Nacorid所指出的,
CDATE
对待这一点有点不同(标准转换),并试图将其解决为一个日期,即8月27日(本年度)

“27.8.”
“27,8,
,您的)抛出错误,因为日期不可识别,并且由于两个十进制指针,产生了一个
错误

“27,8”
“27.8.”
在您的上)不是可识别的日期,Excel假定需要删除000个分隔符,因此将其转换为278 =过去278天
31/12/1899
=
04/10/1900

因此,TL;DR表示,Excel不接受
“27.8”。
-虽然在德语中可以作为日期使用,但您需要捕获这些数据,并添加一个假定年份或类似年份来绕过它

Additional input: "26.8." -> output: 24.09.1900
Input: "26.08." -> output: 20.02.1907

可选地,考虑添加一个日历弹出表单,强制用户提供日期、月份和年份。< /P>如果将<代码> 24.081900 < /代码>转换成整数,则得到<代码> 268 <代码>,我将假定没有输入完整日期,在xx/xx/xxxx格式中,您的代码也不是将其作为整数并将其转换为日期。而

20.02.1907
2608
。。我应该加上1=1900年1月1日,2=1900年1月2日等。。十进制是一天中的一部分。。因此,1.5是1900年1月1日正午的好成绩!现在的问题仍然是为什么结尾处的
会使其成为整数…为什么
26.8。
=
268
对于许多问题,没有足够的答案。。。你们有小数作为数字的分隔符吗?你们有小数作为数字的分隔符吗?不是约会。。以代码形式提问很可能是将“未完成日期”解释为一个数字,并以小数点作为分隔符。。id更新您的代码,以便用户以所需格式输入日期,否则将拒绝输入。没有错误哦,我喜欢这个,我会用用户输入的完整部分更新我的帖子,不客气。有时处理问题的最佳方法不是解决问题,而是找到解决问题的最快方法。
“27.8”
正确地转换为
27/08/2019
尽管你是对的-我在分析Excel在将文本转换为数字时所做的工作,而不是使用
CDATE
。我已经编辑了答案。谢谢