Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA验证文本框中的特定格式_Excel_Vba - Fatal编程技术网

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

Excel VBA验证文本框中的特定格式,excel,vba,Excel,Vba,如何验证文本框中的特定格式?我正在将标签扫描到一个文本框中,其中包含一个日期,格式如下: mm.dd.yyyy.hh.mm.ss 我试过一些不起作用的东西 If Not Format(TextBox1, "mm.dd.yyyy.hh.mm.ss") Then MsgBox "Wrong Format" End If 尝试: 如果textbox1=Format(textbox1,“mm.dd.yyy.hh.mm.ss”),则textbox1不包含日期格式,因此无法使用日期/时间格式代码应用Fo

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

mm.dd.yyyy.hh.mm.ss
我试过一些不起作用的东西

If Not Format(TextBox1, "mm.dd.yyyy.hh.mm.ss") Then
MsgBox "Wrong Format"
End If
尝试:
如果textbox1=Format(textbox1,“mm.dd.yyy.hh.mm.ss”),则

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
子测试()
将A()设置为字符串,将Rslt设置为布尔值
A=拆分(Me.TextBox1.Value,“.”将点分隔的元素加载到数组中
如果UBound(A)5,则
MsgBox“不是由(5)个点分隔的6个数字”
Rslt=False
如果Val(A(0))<1或Val(A(0))>12则
MsgBox“第一部分不是有效月份(01-12)”
Rslt=False
ElseIf Val(A(1))<1或Val(A(1))>31则
MsgBox“第二部分不是有效日期(01-31)”
Rslt=False
ElseIf Val(A(2))<0或Val(A(1))>99则
MsgBox“第三部分不是有效年份(00-99)”
Rslt=False
ElseIf Val(A(3))<0或Val(A(3))>23则
MsgBox“第四部分不是有效时间(00-23)”
Rslt=False
ElseIf Val(A(4))<0或Val(A(4))>59则
MsgBox“第五部分不是有效分钟(00-59)”
Rslt=False
ElseIf Val(A(5))<0或Val(A(5))>59则
MsgBox“第六部分不是有效的第二部分(00-59)”
Rslt=False
如果结束
如果不是Rslt,那么
"打败用户",
如果结束
端接头

这不考虑28/29个/ 30/31天的月份,但如果是更远的话,只有1或2个。

< P>你可以用这个简单的函数来检查日期是不是/P>
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.05
(其中
mm.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
其中,
UserForm1
内部有一个名为
TextBox1
TextBox
,函数
checkFormatDate2
位于常规模块中。在我的情况下,我只是发送了一个
MsgBox
,说那不是一个日期

编辑#4

与退出UserForm时验证文本框内文本的方法相同,如下所示:

1) 添加一个按钮并将
Cancel
属性设置为
TRUE

2) 在代码中,你可以这样写:

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
或按按钮
CommandButton1
时,您尝试关闭用户窗体并启动内部代码,并测试
TextBox
中的文本,您可以做任何您想做的事情,例如,不要让用户离开,返回到文本框后,一条消息说什么是正确的格式,以及你想要什么

你试过了吗?由于TextBox1不包含日期,因此由于您的帮助和建议,日期格式将产生溢出错误。我计划测试并尝试所有这些方法,以更好地理解这是如何工作的。请注意,在一个文本框中,用户输入的内容你无法控制;前面的一个空格可能会给你的
Mid()
函数带来完全意想不到的结果,并破坏你的
DateSerial()
进一步。嘿@MikeD,我会接受你的建议。谢谢。@ElbertVillarreal谢谢你的代码,我正在尝试,但似乎无法调用textbox exit上的函数。我收到一个错误“Argument Not Optional”嘿,检查我(上次)的编辑#4。@ElbertVillarreal非常感谢您提供的详细信息和您的时间。我有这个工作,这正是我需要的。
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