Excel VBA验证文本框中的特定格式

时间:2016-03-02 14:36:38

标签: excel vba

如何验证文本框中的特定格式?我正在将标签扫描到包含日期格式为:

的文本框中
mm.dd.yyyy.hh.mm.ss

我尝试了不起作用的东西......

If Not Format(TextBox1, "mm.dd.yyyy.hh.mm.ss") Then
MsgBox "Wrong Format"
End If

3 个答案:

答案 0 :(得分:0)

尝试: 如果textbox1 = Format(TextBox1," mm.dd.yyyy.hh.mm.ss")那么

答案 1 :(得分:0)

TextBox1不包含日期格式,因此您无法使用日期/时间格式代码应用Format()函数。

一种解决方案是将字符串拆分为数组元素并逐个检查,例如

Sub Test()
Dim A() As String, Rslt As Boolean

A = Split(Me.TextBox1.Value, ".") ' load dot seperated elements into array

If UBound(A) <> 5 Then
    MsgBox "not 6 numbers seperated by (5) dots"
    Rslt = False

ElseIf Val(A(0)) < 1 Or Val(A(0)) > 12 Then
    MsgBox "1st part not a valid month (01-12)"
    Rslt = False

ElseIf Val(A(1)) < 1 Or Val(A(1)) > 31 Then
    MsgBox "2nd part not a valid day (01-31)"
    Rslt = False

ElseIf Val(A(2)) < 0 Or Val(A(1)) > 99 Then
    MsgBox "3rd part not a valid year (00-99)"
    Rslt = False

ElseIf Val(A(3)) < 0 Or Val(A(3)) > 23 Then
    MsgBox "4th part not a valid hour (00-23)"
    Rslt = False

ElseIf Val(A(4)) < 0 Or Val(A(4)) > 59 Then
    MsgBox "5th part not a valid minute (00-59)"
    Rslt = False

ElseIf Val(A(5)) < 0 Or Val(A(5)) > 59 Then
    MsgBox "6th part not a valid second (00-59)"
    Rslt = False
End If

If Not Rslt Then
    'beat the user
End If
End Sub

这不会考虑28/29/30/31天的月份,但如果距离较远则只有1或2个。

答案 2 :(得分:0)

您可以使用此简单功能检查日期是否为

Function checkFormatDate(str As String) As Boolean
    Dim Y
    Dim M
    Dim D
    Dim H
    Dim I
    Dim S
    Dim theDate As Date

    M = Mid(str, 1, 2)
    D = Mid(str, 4, 2)
    Y = Mid(str, 7, 4)
    H = Mid(str, 12, 2)
    I = Mid(str, 15, 2)
    S = Mid(str, 18, 2)

    theDate = DateSerial(Y, M, D) + TimeSerial(H, I, S)

    If IsDate(theDate) Then
        checkFormatDate = True
    Else
        checkFormatDate = False
    End If
End Function

这会返回TRUE(如果是日期)或FALSE(如果不是)

关注日期,例如:02.05.2016.01.10.05mm.dd.yyyy.hh.mm.ss),因为您需要相信02是月份,而不是05是一天而不是一个月,总是出现一个有个好主意的人,并且只是因为改变了价值。

编辑#2

这是一个更好的代码版本:

测试仪:

Sub testDate()
Dim Check As Boolean
    Check = checkFormatDate2(UserForm1.TextBox1.Text)
    'the textbox is inside UserForm1
    If Check Then
        MsgBox "Is a Date"
    Else
        MsgBox "Not a Date"
    End If
End Sub

功能:

Function checkFormatDate2(str As String) As Boolean
    Dim ArrayD
    Dim i
    Dim m
    ArrayD = Split(str, ".")

    If UBound(ArrayD) <> 5 Then
        checkFormatDate2 = False
        Exit Function
    End If

    For i = 0 To 5
        Select Case i
            Case 0
                If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 12 Then
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case 1
                If CInt(ArrayD(i + 1)) < 1900 Or CInt(ArrayD(i + 1)) > 2050 Then
                    'set the botton and limit year as you need
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case 2
                 m = Day(DateSerial(CInt(ArrayD(2)), CInt(ArrayD(0)) + 1, 1) - 1)
                 'm = the last (num) day of the month
                If CInt(ArrayD(i - 1)) < 1 Or CInt(ArrayD(i - 1)) > m Then
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case 3
                If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 23 Then
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case 4
                If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 59 Then
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case 5
                If CInt(ArrayD(i)) < 1 Or CInt(ArrayD(i)) > 59 Then
                    checkFormatDate2 = False
                    Exit Function
                End If
            Case Else
        End Select
    Next i
    checkFormatDate2 = True
End Function

使用此功能验证TextBox内的文本是否为发送TextBox.ValueTextBox.Text的日期。感谢MikeD的建议。这种方式更好。

编辑#3

正如您在评论中告诉我的那样,您可以使用AfterUpdate上的Textbox,如下所示:

Private Sub TextBox1_AfterUpdate()
    Dim a As Boolean
    a = checkFormatDate2(Me.TextBox1.Value)
    If a Then
        MsgBox "is date"
    Else
        MsgBox "no date"
    End If
End Sub

UserForm1内部有一个名为TextBox的{​​{1}},而TextBox1函数位于常规模块中。在我的情况下,我只是发送checkFormatDate2说不是约会。

编辑#4

以这种方式退出UserForm时,可以通过验证TextBox内部文本的相同方式:

1)添加一个按钮,将MsgBox属性设置为Cancel

enter image description here

2)在代码中你放了这个:

TRUE

这样,当您按键盘上的Private Sub CommandButton1_Click() Dim a As Boolean a = checkFormatDate2(Me.TextBox1.Value) If a Then MsgBox "is date" Else MsgBox "no date" End If End Sub 或按下ESC按钮时,您会尝试关闭UserForm并激活内部代码,并测试CommandButton1内的文本你可以做任何你想做的事情,因为,不要让用户离开,在一条消息说明什么是正确的格式后,回到TextBox,以及你想要什么。