Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Mid(TextBox1.Value, 4, 2) > 12 Then
MsgBox "Invalid date, please re-enter", vbCritical
TextBox1.Value = vbNullString
TextBox1.SetFocus
Exit Sub
End If
StartDate = DateSerial(Year(Date), Month(Date), Day(Date))
TextBox1.Value = Format(TextBox1.Value, "dd.mm.yyyy")
StartDate = TextBox1.Value
End Sub
此代码对我和我的同事非常有用,以确保在文本框中输入的值是日期。但是,来自其他国家/地区(但日期格式为dd.mm.yyyy
的同事)的结果也很奇怪。
例如:如果他输入01.10.2017
,则TextBox会自动将日期格式化为20.03.4917
。
我怀疑在这种情况下,输入的值不能识别为日期,而是一个数字,因为如果将01102017
转换为日期,在Excel中将转换为20.03.4917
。
有人对这个问题有建议或猜测吗?
感谢和问候
答案 0 :(得分:2)
您可以将日期.
分割成一个数组ArrInput
,然后使用DateSerial
使其成为一个可以格式化的真实日期。
Dim ArrInput As Variant
ArrInput = Split(TextBox1.Value, ".")
'StartDate = DateSerial(Year(Date), Month(Date), Day(Date)) 'I see no use in this at all
TextBox1.Value = Format$(DateSerial(ArrInput(2), ArrInput(1), ArrInput(0)), "dd.mm.yyyy")
StartDate = TextBox1.Value
Format(TextBox1.Value, "dd.mm.yyyy")
的问题在于,您可以在此处让Excel猜测TextBox1.Value
中的字符串是哪种日期格式。它会自动转换为数字,然后再次转换为字符串。
为避免日期混淆,我建议始终根据ISO 8601使用YYYY-MM-DD
格式。这是唯一可读的日期格式,不会被误解。当按实际为字符串的日期排序时,它也有好处。
要使验证更加可靠,请使用类似以下内容的
:Dim ArrInput As Variant
ArrInput = Split(TextBox1.Value, ".")
Dim ValidDate As Boolean
If UBound(ArrInput) = 2 Then 'make sure there are exactly two dots in the date
If ArrInput(1) > 0 And ArrInput(1) <= 12 And _ 'month <= 12
ArrInput(0) > 0 And ArrInput(0) <= 31 Then 'day <= 31
ValidDate = True
End If
Else
ValidDate = False
End If
If Not ValidDate Then
MsgBox "Invalid date, please re-enter in format dd.mm.yyyy", vbCritical
TextBox1.Value = vbNullString
TextBox1.SetFocus
Exit Sub
End If
TextBox1.Value = Format$(DateSerial(ArrInput(2), ArrInput(1), ArrInput(0)), "dd.mm.yyyy")
StartDate = TextBox1.Value
答案 1 :(得分:1)
我相信您的同事输入的文本字符串“ 01102017”不带点。
您可能希望将此类条目转换为有效日期:
' "01102017" => 01.10.2017 - 8 chars variant
' "011017" => 01.10.2017 - 6 chars variant
这需要在日期转换之前进行。
将输入值的日志添加到可用单元格范围和
将工作簿发回给您:
...
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Range("Z1").value = "'" & TextBox1.Value
If Mid(TextBox1.Value, 4, 2) > 12 Then
...
检查是否仅使用数字:
How to check if a string contains only numbers?
并检查字符串的长度(6或8个字符的变体),并检查年份部分是否在有效范围内=>尝试转换为日期并将其提供给用户。