我在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)。
有人能看出为什么我的方法不起作用吗?我已经尝试了一些不同的方法并且已经搜索了很多,但我找不到有用的东西。
谢谢
答案 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*$"