2012-06-05 66 views
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)。

任何人都可以看到为什么我的方法不工作?我尝试了几种不同的方法,并且搜索了很多,但我找不到有效的方法。

谢谢

回答

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 
+0

这是完美的。非常感谢! – Alex

+0

@Randy:谢谢Randy :)。我只是增加了一个额外的功能。 –

+0

感谢您的解决方案。我尝试过这个。它的工作原理除了我仍然可以添加点(十进制)符号 –

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*$" 
+0

+ 1 :)很好的使用RegExp :) –