2017-01-19 787 views
0

我有一个代码,允许我手动在textbox1中输入日期,然后在useform的日历中选择日期。还有第二个文本框允许我添加或减少日期。代码完美工作。textbox日期格式excel vba

用户窗体代码 -

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中以特定的格式输入日期。

的格式将是 -

DD

DDMMM

ddmmmyyy

我不知道怎么写,做这样的代码。

这个想法是在上面指定的三种格式中的任何一种中输入日期textbox1,然后在用户窗体上的日历上选择日期。

回答

0

运算的澄清后,编辑关于允许的格式

,你可以建立在下面的代码

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