文本框日期格式excel vba

文本框日期格式excel vba,vba,excel,Vba,Excel,我有一个代码,允许我在textbox1中手动输入日期,然后在useform的日历中选择该日期。第二个文本框允许我添加或减去日期。代码工作得很好 用户表单代码- 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

我有一个代码,允许我在textbox1中手动输入日期,然后在useform的日历中选择该日期。第二个文本框允许我添加或减去日期。代码工作得很好

用户表单代码-

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中以上述3种格式中的任意一种格式输入日期,然后在用户表单上的日历上选择该格式。

在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
选项显式
私有子文本框1_退出(ByVal Cancel作为MSForms.ReturnBoolean)
Dim txt作为字符串,dayStr作为字符串,monthStr作为字符串,yearStr作为字符串
作为布尔值
txt=Me.TextBox1.Value
选择案例长度(txt)
案例2
dayStr=txt
OKTX=okDay(dayStr)
monthStr=月份(现在)
yearStr=年(现在)
案例5
dayStr=Mid(txt,3,3)
monthStr=Mid(txt,3,3)
okTxt=okDay(左(txt,2))和OkMonthstr(月)
yearStr=年(现在)
案例7
dayStr=Mid(txt,3,3)
monthStr=Mid(txt,3,3)
yearStr=Mid(txt,6,2)
okTxt=okDay(左(txt,2))和okMonth(月)和okYear(年)
结束选择
如果不是,那么
MsgBox“无效日期”_
&vbCrLf&vbCrLf&“日期必须以以下格式之一输入:”_
&vbCrLf和vbTab及“dd”_
&vbCrLf&vbTab和“ddmmm”_
&vbCrLf&vbTab&“ddmmmyy”_
&vbCrLf&vbCrLf&“请重试”,vbCritical
取消=真
其他的
Me.Calendar1.Value=CDate(左(txt,2)和“&monthStr和”&yearStr)
如果结束
端接头
函数okDay(txt作为字符串)作为布尔值
okDay=CInt(txt)>0且CInt(txt)<31
端函数
函数okMonth(txt作为字符串)作为布尔值
Const months As String=“janfebmaraprmajunjulug sepoctnovdec”
okMonth=InStr(月,UCase(txt))>0
端函数
函数okYear(txt作为字符串)作为布尔值

okYear=CInt(txt)>0和CInt(txt)<200'我不确定我是否做错了什么。我右键单击userform并粘贴了上面的代码。现在,当我键入25或25Jan或25Jan17时,代码不会在日历上选择25Jan。我做错了什么当我输入日期为1月25日或17日25日时,代码起作用。br/当我将日期输入为25时,将获取一个错误-运行时错误“13”:类型不匹配,代码为“okDay=CInt(txt)>0且CInt(txt)<31“高亮显示请关闭此帖子,接受原始问题的答案,并为新问题撰写新帖子。在后一种情况下,您最好发布代码尝试,并指定什么不起作用以及原因。非常感谢。正如您在“要将答案标记为已接受,请单击答案旁边的复选标记,将其从灰色变为已填写。”