【问题标题】:textbox date format excel vba文本框日期格式excel vba
【发布时间】:2017-06-03 18:46:30
【问题描述】:

我有一个代码允许我在 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

ddmm

ddmmmyyy

我不确定如何编写执行此操作的代码。

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    编辑在 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
    

    【讨论】:

    • 我不确定我是否做错了什么。我右键单击用户窗体并粘贴上面的代码。现在,当我输入 25 或 25Jan 或 25Jan17 时,代码不会在日历上选择 25Jan。我做错了什么
    • 当我输入日期为 25Jan 或 25Jan17 时,代码有效。 br/ 当我输入日期为 25 时,出现错误 - 运行时错误 '13': Type mismatch and code '' okDay = CInt(txt) > 0 And CInt(txt)
    • 请关闭此帖子,接受您的原始问题的答案,并为新问题发布新帖子。在后者中,您最好发布您的代码尝试并指定什么不起作用以及为什么。谢谢!
    • 正如您在this Help section 中看到的那样“要将答案标记为已接受,请单击答案旁边的复选标记以将其从灰色切换为已填充。”
    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 2015-08-31
    • 1970-01-01
    • 2016-01-11
    • 2023-03-20
    • 2013-04-01
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多