2017-01-19 7 views
0

У меня есть код, который позволяет мне вручную вводить дату в текстовое поле1, которое затем выбирается в календаре на форме использования. Существует второе текстовое поле, которое позволяет мне добавлять или вычитать даты. Код работает отлично.текстовый формат даты excel vba

UserForm код -

Option Explicit 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    If IsDate(Me.TextBox1.Value) Then Me.Calendar1.Value = Me.TextBox1.Value 
End Sub 
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    Dim dt As Date 
    With Me 
     If IsDate(.TextBox1.Value) Then 
      dt = CDate(.TextBox1.Value) + Val(.TextBox2.Value) 
      .TextBox1.Value = dt 
      .Calendar1.Value = dt 
     End If 
    End With 
End Sub 

Я хотел бы, чтобы вручную ввести дату в TextBox1 в определенном формате.

форматы будут -

дд

ddmmm

ddmmmyyy

Я не знаю, как написать код, который делает это.

Идея состоит в том, чтобы ввести дату в любом из трех форматов, указанных выше в текстовом поле 1, которое затем выбирается в календаре пользовательской формы.

ответ

0

отредактирован после осветления Op в о допустимых форматах

вы могли бы построить на следующий код

Option Explicit 

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
    Dim txt As String, dayStr As String, monthStr As String, yearStr As String 
    Dim okTxt As Boolean 

    txt = Me.TextBox1.Value 
    Select Case Len(txt) 
     Case 2 
      dayStr = txt 
      okTxt = okDay(dayStr) 
      monthStr = month(Now) 
      yearStr = year(Now) 
     Case 5 
      dayStr = Mid(txt, 3, 3) 
      monthStr = Mid(txt, 3, 3) 
      okTxt = okDay(Left(txt, 2)) And okMonth(monthStr) 
      yearStr = year(Now) 
     Case 7 
      dayStr = Mid(txt, 3, 3) 
      monthStr = Mid(txt, 3, 3) 
      yearStr = Mid(txt, 6, 2) 
      okTxt = okDay(Left(txt, 2)) And okMonth(monthStr) And okYear(yearStr) 
    End Select 
    If Not okTxt Then 
     MsgBox "Invalid date" _ 
       & vbCrLf & vbCrLf & "Date must be input in one of the following formats:" _ 
       & vbCrLf & vbTab & "dd" _ 
       & vbCrLf & vbTab & "ddmmm" _ 
       & vbCrLf & vbTab & "ddmmmyy" _ 
       & vbCrLf & vbCrLf & "Please try again", vbCritical 

     Cancel = True 
    Else 
     Me.Calendar1.Value = CDate(Left(txt, 2) & " " & monthStr & " " & yearStr) 
    End If 
End Sub 

Function okDay(txt As String) As Boolean 
    okDay = CInt(txt) > 0 And CInt(txt) < 31 
End Function 

Function okMonth(txt As String) As Boolean 
    Const months As String = "JANFEBMARAPRMAJJUNJULAUGSEPOCTNOVDEC" 
    okMonth = InStr(months, UCase(txt)) > 0 
End Function 

Function okYear(txt As String) As Boolean 
    okYear = CInt(txt) > 0 And CInt(txt) < 200 '<--| set your "limit" years 
End Function 
+0

я не уверен, если я делаю что-то неправильно. Я щелкнул правой кнопкой мыши по пользовательской форме и вставил код выше. Теперь, когда я печатаю 25 или 25Jan или 25Jan17, код не выбирает 25Jan в календаре. Что я делаю неправильно – user2194182

+0

Код работает, когда я вводю дату как 25Jan или 25Jan17. br/ Когда я ввожу дату как 25, появляется сообщение об ошибке как - Ошибка времени выполнения '13': Введите несоответствие и код '' okDay = CInt (txt)> 0 И CInt (txt) <31 "получает подсветку – user2194182

+0

, пожалуйста, закройте это сообщение, принимающее ответ на ваш вопрос _original_ и сделайте новый пост для новой проблемы. В этом последнем случае вам лучше разместить свои попытки кода и указать, что не работает и почему. спасибо! – user3598756

Смежные вопросы