Текстовое поле преобразует дату в число - PullRequest
0 голосов
/ 23 января 2019
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 преобразуется в 20.03.4917 в Excel, если вы преобразуете его как дату.

У кого-нибудь есть предложение или предположение, как обойти эту проблему?

Спасибо и наилучшими пожеланиями

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я верю, что ваш коллега вводит текстовую строку "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
...




Проверьте, используются ли только цифры:
Как проверить, содержит ли строка только цифры?

и проверьте длину строки (вариант 6 или 8 символов) и проверьте, находится ли часть года в допустимом диапазоне => попытаться преобразовать в дату и предложить ее пользователю.

0 голосов
/ 23 января 2019

Вы можете разделить дату на . в массив 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...