如何检查是否值的用户在文本框正在进入一个数字双?

问题描述 投票:2回答:3

我想,以检查是否用户在文本框中输入一个数值,小数接受。任何帮助,高度赞赏。

Private Sub textbox1_AfterUpdate()
If IsNumeric(textbox1.Value) = False Then
Me!textbox1.Undo
    MsgBox "only numbers are allowed"
Exit Sub
End If
Exit Sub

使用前事件:

Private Sub textbox1_BeforeUpdate(Cancel As Integer)
If IsNumeric(textbox1.Value) = False Then
    MsgBox "only numbers are allowed"
Me!textbox1.Undo
Cancel = True
Exit Sub
End If
Exit Sub

我当前的代码根本不会执行。我也试过在textbox1_BeforeUpdate事件。请参阅代码。

新代码:

Public Function IsValidKeyAscii(ByVal keyAscii As Integer, ByVal value As 
String) As Boolean
IsValidKeyAscii = (keyAscii = vbKeyDot And InStr(1, value, Chr$(vbKeyDot)) = 
0) Or (keyAscii >= vbKey0 And keyAscii <= vbKey9)
End Function

Private Sub textbox1_KeyDown(KeyCode As Integer, Shift As Integer)
If Not IsValidKeyAscii(KeyCode, textbox1.value) Then KeyCode = 0

End Sub
vba access-vba
3个回答
2
投票

你不应该使用VBA完成这个任务的。

只需设置字段格式属性的常规数字。这是确保用户只能在一个字段中输入数字内置方式。


2
投票

写一个验证功能(可能是在它自己的KeyInputValidator类或模块),所以你可以随处重用这个逻辑你需要它,而不是复制/粘贴它需要每一个数字文本框:

Option Explicit
Private Const vbKeyDot As Integer = 46

'@Description("returns true if specified keyAscii is a number, or if it's a dot and value doesn't already contain one")
Public Function IsValidKeyAscii(ByVal keyAscii As Integer, ByVal value As String) As Boolean
    IsValidKeyAscii = (keyAscii = vbKeyDot And InStr(1, value, Chr$(vbKeyDot)) = 0) Or (keyAscii >= vbKey0 And keyAscii <= vbKey9)
End Function

然后,在文本框KeyPress事件处理程序使用它(假设这是一个MSForms TextBox控件),以确定是否将接受输入 - 因为事件提供一个MSForms.ReturnInteger对象,该对象的Value属性可以被设置为0到‘吞噬’一个按键:

Private Sub TextBox1_KeyPress(ByVal keyAscii As MSForms.ReturnInteger)
    If Not IsValidKeyAscii(keyAscii.Value, TextBox1.value) Then keyAscii.Value = 0
End Sub

你不需要撤消任何输入或弹出恼人的警告或消息框这样:在字段中的值保证是一个有效的数值!


编辑上面的事件处理程序的签名是否为一个MSForms控制。貌似Access使用不同的接口:

Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)

在这里,KeyCode传递ByRef,这样你就可以直接改变它。换句话说,这变成逻辑:

    If Not IsValidKeyAscii(KeyCode, TextBox1.value) Then KeyCode = 0

0
投票

您可以尝试使用失去焦点的事件:

Private Sub TextBox1_LostFocus()
    Dim blnNumber As Boolean
    Dim strNumber As String

    strNumber = TextBox1.Value
    blnNumber = IsNumeric(strNumber)

    If Not blnNumber Then
        Me!TextBox1.Undo
        MsgBox "only numbers are allowed"
    Else
        'And, if you want to force a decimal.
        If InStr(strNumber, ".") < 1 Then
            Me!TextBox1.Undo
            MsgBox "only doubles are allowed"
        End If
    End If
End Sub

另外,请检查您在访问列出的Textbox1的元素。是它的名字TextBox1的?或者是其他东西?例如,在Excel中也表示类似如下:=EMBED("Forms.TextBox.1","")即使该代码引用是TextBox1的名字。

© www.soinside.com 2019 - 2024. All rights reserved.