将用户输入限制为Userform文本框上的整数

时间:2012-06-05 20:30:47

标签: excel vba

我在userform上有一个文本框,我试图将用户输入限制为仅允许整数值。我能够做到这一点,但行为有点奇怪。首先,这是我的代码:

Private Sub txtAnswer_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If (KeyAscii >= 48) And (KeyAscii <= 57) Then
       Me.txtAnswer.SetFocus
   Else
       KeyAscii = 0
       Me.txtAnswer.SetFocus
   End If
 End Sub

问题是,在用户输入值后,焦点似乎远离文本框。此外,如果用户确实输入了整数值,则从文本框中删除该值(即输入被“吃掉”)。 SetFocus行是我尝试使控件行为正确,但它们似乎没有效果。

我想要做的就是确保用户不在文本框中输入类似“r”(或任何其他非整数值)的内容。任何整数值&gt; = 0都是完全可以接受的(包括多个数字值,如10或1000000)。

有人能看出为什么我的方法不起作用吗?我已经尝试了一些不同的方法并且已经搜索了很多,但我找不到有用的东西。

谢谢

2 个答案:

答案 0 :(得分:7)

向前迈出一步!

'~~> Disable Pasting CTRL V , SHIFT + INSERT
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If (Shift = 2 And KeyCode = vbKeyV) Or (Shift = 1 And KeyCode = vbKeyInsert) Then
        KeyCode = 0
    End If
End Sub

'~~> Preventing input of non numerics
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
      Case vbKey0 To vbKey9, vbKeyBack, vbKeyClear, vbKeyLeft, _
      vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
      Case Else
        KeyAscii = 0
        Beep
    End Select
End Sub

答案 1 :(得分:5)

您也可以使用正则表达式。

Private Sub txtAnswer_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    With CreateObject("VBScript.RegExp")
        .Pattern = "^\d*$"
        .IgnoreCase = True     

        If Not .Test(TextBox1.Value & Chr(KeyAscii)) Then KeyAscii = 0        
    End With

End Sub

优点是,如果你需要检查更复杂的字符串组合,比如对于负整数,比如:

.Pattern = "^[-+]?\d*$"

或另一个例子没有前导零:

.Pattern = "^[1-9]{1}\d*$"