如何验证文本框中的特定格式?我正在将标签扫描到包含日期格式为:
的文本框中mm.dd.yyyy.hh.mm.ss
我尝试了不起作用的东西......
If Not Format(TextBox1, "mm.dd.yyyy.hh.mm.ss") Then
MsgBox "Wrong Format"
End If
答案 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.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
使用此功能验证TextBox内的文本是否为发送TextBox.Value
或TextBox.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
:
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,以及你想要什么。