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