文本框将日期转换为数字

时间:2019-01-23 09:27:42

标签: excel vba date

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

有人对这个问题有建议或猜测吗?

感谢和问候

2 个答案:

答案 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个字符的变体),并检查年份部分是否在有效范围内=>尝试转换为日期并将其提供给用户。