Проверьте формат даты в текстовом поле - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу предоставить текстовое поле в Excel VBA для ввода даты.Допустимые форматы даты: дм-гг или гггг, дд-мм-гг или гггг, д / м / гг или гггг, дд / мм / гг или гггг.Но формат вывода должен быть дд-мм-гггг.Я просто не знаю с чего начать.Я знаю, как записать данные в требуемый, кроме рабочего листа, но понятия не имею об этом коде. Пожалуйста, руководство

If IsDate(Me.TextBox2.Value) = False Then. 
MsgBox "Enter a valid date format." & vbNewLine _  
& "Valid Date Formats are:" & vbNewLine & vbNewLine _  
& "D/M/YY" & vbNewLine _  
& "DD/MM/YYYY" & vbNewLine _ & "D-M-YY" & vbNewLine _  
& "DD-MM-YYYY", vbExclamation, "Date Format ERROR"  
TextBox2.Activate  
Exit Sub  
End If 
'This works perfect 
Worksheets("PURCHASE").Range("B" & newrow) = CDate(TextBox2.Text)
Worksheets("PURCHASE").Range("B" & newrow).NumberFormat = "dd-mm-yyyy"  

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Существует функция VBA Range.IsDate , которая пытается разрешить допустимую дату как истинную и недействительную дату как ложную.

В Windows диапазон действительных дат - от 1 января 100 г. до 31 декабря 9999 г.н .; диапазоны варьируются в зависимости от операционной системы.

Это не объясняет систему дат Excel 1900, но объясняет систему дат Excel 1904. Вину Lotus 1-2-3 за неравенство.

Какой бы алгоритм ни использовался в IsDate, я могу сказать, что у меня был чуть больший успех при его использовании, чем у CDate преобразования в широком диапазоне системных локалей как на исходном, так и на целевом конце.

В конечном итоге я нашел стандарт SQL YYYYMMDD эффективным методом хранения и доставки, а также необработанные длинные целые числа. Последний просто потребует форматирования ячеек в Excel, чтобы показать реальному человеку, что значение является датой.

Если ваш код принимает введенную строковую дату, как проверено CDate или IsDate, возможно, вы переносите строковую дату в свою ячейку. Даты являются числовыми и, возможно, должны быть отформатированы, чтобы человек мог видеть их как даты, а не как 43453.

Worksheets("PURCHASE").Range("B" & newrow) = cdate(TextBox2.Text)
Worksheets("PURCHASE").Range("B" & newrow).numberformat = "dd/mm/yyyy"
0 голосов
/ 26 апреля 2019

Можно было бы после того, как пользователь ввел строку в текстовое поле, проверить, можно ли отформатировать дату. Если нет, то была добавлена ​​бессмысленная дата, и пользователь может быть уведомлен о проблеме

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    Dim nwdate As String

    If Len(TextBox1.Value) < 6 Then GoTo falsedate
    nwdate = Format(TextBox1.Value, "dd-mm-yyyy")
    If nwdate = TextBox1.Value And Format(nwdate, "dd-mmmm-yyyy") = nwdate Then
        GoTo falsedate
    Else
        TextBox1.Value = nwdate
    End If
    Exit Sub
falsedate:
    MsgBox "Enter a valid date before proceeding", vbExclamation, "Error"
    TextBox1.Value = ""
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...