Excel userform textbox必填字段仅接受数字模式

Excel userform textbox必填字段仅接受数字模式,excel,vba,Excel,Vba,我需要帮助才能使exceluserformtextbox只接受数字模式。我的数字模式是12位。00.4位或8位,因此文本框应只接受类似于772344566.00.0001或77186238的数字。 我一直在寻找类似问题的线索,但都没有给我任何方向。 我目前的代码是这样的,但与我的目标并不接近: Private Sub Textbox3_Exit(ByVal Cancel As MsForms.ReturnBoolean) IF TextBox3.Value <>"&quo

我需要帮助才能使excel
userform
textbox
只接受数字模式。我的数字模式是12位。00.4位或8位,因此
文本框
应只接受类似于772344566.00.0001或77186238的数字。 我一直在寻找类似问题的线索,但都没有给我任何方向。 我目前的代码是这样的,但与我的目标并不接近:

Private Sub Textbox3_Exit(ByVal Cancel As MsForms.ReturnBoolean)
 IF TextBox3.Value <>"" Or TextBox3.Value < 0 Then
      MsgBox "Invalid sales order number"
    TextBox3.SetFocus
 End If
End Sub
Private子文本框3_退出(ByVal取消为MsForms.ReturnBoolean)
如果TextBox3.Value“”或TextBox3.Value<0,则
MsgBox“无效的销售订单号”
TextBox3.SetFocus
如果结束
端接头

您的代码似乎试图拒绝除空白或负值以外的任何值

下面是一些关于VBA中文本框表单验证的问题


您的代码似乎试图拒绝除空白或负值以外的任何值

下面是一些关于VBA中文本框表单验证的问题


首先,检查值的长度。然后,只需将值分解为单独的部分,并检查每个部分。类似这样的内容(现在无法在Linux上进行检查):

val=CStr(TextBox3.Value)
len_val=len(val)
如果len_val=8,则
如果不是数字(val),则
MsgBox“错误”
如果结束
ElseIf len_val=20那么
如果(不是数字(CInt(左(val,12)))或_
中期(val,13,4)“.00.”或_
(不是数字(CInt(Right(val,4)))那么
MsgBox“错误”
如果结束
其他的
MsgBox“错误”
如果结束

首先,检查值的长度。然后,只需将值分解为单独的部分,并检查每个部分。类似这样的内容(现在无法在Linux上进行检查):

val=CStr(TextBox3.Value)
len_val=len(val)
如果len_val=8,则
如果不是数字(val),则
MsgBox“错误”
如果结束
ElseIf len_val=20那么
如果(不是数字(CInt(左(val,12)))或_
中期(val,13,4)“.00.”或_
(不是数字(CInt(Right(val,4)))那么
MsgBox“错误”
如果结束
其他的
MsgBox“错误”
如果结束
试试这个:

Private Sub Textbox3_Exit(ByVal Cancel As MsForms.ReturnBoolean)
If Not TextBox3.Value Like "########" Or _
Not TextBox3.Value Like "############.00.####" Then
      MsgBox "Invalid sales order number"
    TextBox3.SetFocus
End If
End Sub
和/或看一看。基本上,当与
类似的
操作符一起使用时,
会检查任何数字,因此
会检查两位数,以此类推。

尝试以下操作:

Private Sub Textbox3_Exit(ByVal Cancel As MsForms.ReturnBoolean)
If Not TextBox3.Value Like "########" Or _
Not TextBox3.Value Like "############.00.####" Then
      MsgBox "Invalid sales order number"
    TextBox3.SetFocus
End If
End Sub

和/或看一看。基本上,当与
类似的
运算符一起使用时,
会检查任何数字,因此
会检查两位数,依此类推。

请使用下一个函数:

Function textOK(strText As String) As Boolean
    If strText Like "############.00.####" Or strText Like "########" Then
        textOK = True
    End If
End Function
它可以通过以下方式在代码中使用:

  If textOK(TextBox3.Text) Then
    'do whatever you need
  Else
    'send a warning message... or do something else.
  End If
已编辑

您可以通过以下相关方式测试上述功能:

Sub testTextOK()
 Dim x As String
  x = "123456787812.00.0014"
  'x = "12345678"
  'x = "123457j8"
  'x = "123456789"
  Debug.Print textOK(x)
  'or use MsgBox and comment the above code line
   MsgBox textOK(x)
End Sub
请从下到上取消对分配值的
x
行的注释,并在即时窗口中查看返回(在VBE中:`Ctrl+G)


现在是否更容易理解如何使用它?

请使用下一个功能:

Function textOK(strText As String) As Boolean
    If strText Like "############.00.####" Or strText Like "########" Then
        textOK = True
    End If
End Function
它可以通过以下方式在代码中使用:

  If textOK(TextBox3.Text) Then
    'do whatever you need
  Else
    'send a warning message... or do something else.
  End If
已编辑

您可以通过以下相关方式测试上述功能:

Sub testTextOK()
 Dim x As String
  x = "123456787812.00.0014"
  'x = "12345678"
  'x = "123457j8"
  'x = "123456789"
  Debug.Print textOK(x)
  'or use MsgBox and comment the above code line
   MsgBox textOK(x)
End Sub
请从下到上取消对分配值的
x
行的注释,并在即时窗口中查看返回(在VBE中:`Ctrl+G)


现在是否更容易理解如何使用它了?

CInt
如果包含文本字符,它将爆炸。此外,检查
IsNumeric()
不需要转换为整数。一个简单的字符串就可以了。我收到一个编译错误“赋值左边的函数调用必须返回variant或Object”。@KostasK.,我同意你的评论。没有访问VBA来检查代码,因此我只想展示一个大概的想法。
CInt
如果包含文本字符,它将爆炸。此外,检查
IsNumeric()
不需要转换为整数。一个简单的字符串就可以了。我收到一个编译错误“赋值左边的函数调用必须返回variant或Object”。@KostasK.,我同意你的评论。没有访问VBA来检查代码,所以我只想展示一个大概的想法。你说了一些关于“模式”的东西。。。你这么说只是指绳子的长度吗?“77234456566.00.0001”是一种模式吗?但是你也说图案必须有12位数字。你能更好地解释一下“模式”是什么意思吗?你是否应该说整个图案必须有16位数字(包括点),然后你试着用文字来解释它,而不是只显示它?如果是,这是第二个被接受的涉及8位数字的变体吗?@FaneDuru我想OP的意思是“我的数字模式是;12位,然后是“.00”。然后是4位。斯宾塞·巴恩斯:现在我也能看到你的答案了。。。我还假设这是他想要的。但我参考了现有的答案,开始问自己我的理解是否正确。。。我试图澄清问题,只是为了确定,但他没有回答。因为,写一段代码并不困难,在办公室处理了一些紧急的事情后,我发布了一个答案。它和你的非常相似。对我来说,在不涉及任何
TextBox
的情况下测试它会更容易一些……我很抱歉。是的,我的意思是,例如,这里的模式是:“772344566.00.0001”或“72344456”。第一个例子是总共20个数字,有两个点,第二个图案是8个数字,没有点。谢谢你的帮助。你说了些关于“模式”的话。。。你这么说只是指绳子的长度吗?“77234456566.00.0001”是一种模式吗?但是你也说图案必须有12位数字。你能更好地解释一下“模式”是什么意思吗?你是否应该说整个图案必须有16位数字(包括点),然后你试着用文字来解释它,而不是只显示它?如果是,它是一个秒吗