2012-06-05 65 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 :) –