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 に答える