Вы можете разделить дату на .
в массив 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
. Он автоматически преобразуется в число, которое затем снова преобразуется в строку.
Чтобы избежать недопонимания даты, я рекомендую всегда использовать формат YYYY-MM-DD
в соответствии с ISO 8601 . Это единственный формат даты, который читается человеком и не может быть неправильно понят. Он также имеет преимущества при сортировке по датам, которые на самом деле являются строками.
Чтобы сделать проверку еще более надежной, используйте что-то вроде:
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