在阅读一些没有错误处理的旧代码时,我无意中发现了意想不到的CDate()函数行为。
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我要么期望Error 13: Type-mismatch,要么27.08.1900或27.08.2019作为输出。
后两种输入发生了什么情况?我不能把头绕在这上面。
Additional input: "26.8." -> output: 24.09.1900
Input: "26.08." -> output: 20.02.1907区域设置为德语(德国)(Deutschland)
日期格式为DD.MM.YYYY
编辑:
完整的用户输入代码如下所示:
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发布于 2019-08-27 09:05:20
这似乎不是一个CDate行为问题,只是一个一般的文本到数字转换问题。
我没有引用,但从观察到:当试图将文本转换为数字值时,Excel将检查文本是否是一个明显的日期。如果不是这样的话,它就会去掉任何一千的分隔符--当然还有本地货币符号和其他东西--以便在可能的情况下将文本减少到一个数字。
因此,在我的英语现场设置:
"27.8" (__"27,8" on yours)是一个可识别的十进制值= 27天和8/10过去31/12/1899 = 26/01/1900 19:12:00
"27,8" (__"27.8" on yours)是一个不可识别的十进制值,也不是一个可识别的日期,因此它在31/12/1899 = 27/09/1900的278天后去掉了1000个分隔符(逗号在您的设置上,句号)之后,就变成了"278"。
但是,正如@Nacorid所指出的,CDATE对此处理方式略有不同(到标准转换),并试图将其解决到一个日期--即8月27日(当前年份)。
"27.8." (您的__"27,8,")抛出一个错误,因为它是一个不可识别的日期,并且由于有两个十进制指针,因此生成了一个Error。
"27,8," (__"27.8." on yours)不是一个可识别的日期,Excel假定需要移除1000个分隔符,从而将其转换为在31/12/1899 = 04/10/1900之后的278天
因此,TL;DR是"27.8." --虽然在德语中是可以接受的日期--对Excel来说是不可接受的,您需要捕获这些数据,并添加一个假设的年份或类似的年份来绕过它。
或者,考虑添加一个日历弹出表单,强制用户提供日、月和年。
发布于 2019-08-27 08:51:50
这里的问题不是与日期函数有关,因为当输入被格式化为一个字符串时,它给出了预期的行为,这是由德国习惯编写日期而不将日期作为dd.mm.引起的。问题是如何处理这个输入,并且仍然得到预期的结果,这可以通过以下代码实现:
If IsNumeric(userinput) Then
Else
userinput = CDate(userinput & Year(Now()))
End If当变量不被识别为数字时,强制将当前年份插入到用户输入中,这是在.上结束时造成的。这是因为excel中的日期总是以数字形式存储的。将年份添加到输出中会将其转换回一个可以处理的数值,因为excel现在将识别首选分隔符为分隔符,并将其按预期的日期处理。
对我来说,这将是强迫用户修改其输入的首选选择。但是,如果所需的日期不是当前的一年,并且可能会在新年前后引起问题,则无法工作。或者,您可以用普通的"0“或您选择的任何年份替换年份片段。
https://stackoverflow.com/questions/57670002
复制相似问题