3

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

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”(或任何其他非整数值)之类的内容。任何整数值 >= 0 都是完全可以接受的(包括多个数字值,例如 10 或 1000000)。

任何人都可以看到为什么我的方法不起作用?我尝试了几种不同的方法,并进行了相当多的搜索,但我找不到有效的方法。

谢谢

4

2 回答 2

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
于 2012-06-05T21:06:34.083 回答
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*$"
于 2012-06-05T23:31:07.467 回答