Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何检查用户在文本框中输入的值是否为双精度数字?_Vba_Ms Access - Fatal编程技术网

Vba 如何检查用户在文本框中输入的值是否为双精度数字?

Vba 如何检查用户在文本框中输入的值是否为双精度数字?,vba,ms-access,Vba,Ms Access,我试图检查用户是否在文本框中输入数字值,接受小数点。非常感谢您的帮助 Private Sub textbox1_AfterUpdate() If IsNumeric(textbox1.Value) = False Then Me!textbox1.Undo MsgBox "only numbers are allowed" Exit Sub End If Exit Sub 使用BeforeUpdate事件: Private Sub textbox1_BeforeUpdate(Cance

我试图检查用户是否在文本框中输入数字值,接受小数点。非常感谢您的帮助

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

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
公共函数isvalidkeyscii(ByVal-keyscii为整数,ByVal-value为
字符串)作为布尔值
isvalidkeyacii=(keyacii=vbKeyDot和InStr(1,值,Chr$(vbKeyDot))=

0)或(keyscii>=vbKey0和keyscii您可以尝试使用失去焦点事件:

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
Private子文本框1\u LostFocus()
Dim blnNumber作为布尔值
作为字符串的Dim strNumber
strNumber=TextBox1.Value
blnNumber=IsNumeric(strNumber)
如果不是blnNumber,那么
我!TextBox1.Undo
MsgBox“只允许使用数字”
其他的
'并且,如果您想强制使用十进制。
如果仪表(序号“.”)小于1,则
我!TextBox1.Undo
MsgBox“仅允许双精度”
如果结束
如果结束
端接头
此外,请检查access中列出的Textbox1元素。它是名称Textbox1?还是其他名称?
例如,在excel中,它的表示方式如下:
=EMBED(“Forms.TextBox.1”,”)
,即使代码引用的名称是TextBox1。

编写验证程序函数(可以在其自己的
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
这样,您就不需要撤消任何输入,也不需要弹出任何恼人的警告或消息框:字段中的值保证是有效的数值


编辑上述事件处理程序签名用于
MSForms
控件。Access似乎使用了不同的界面:

Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
此处传递的
KeyCode
ByRef
,因此您可以直接更改它。换句话说,这将成为逻辑:

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

您根本不应该将VBA用于此任务


只需将field format属性设置为General number。这是确保用户只能在字段中输入数字的内置方法。

Nice!我想我可能应该避免访问问题(或开始摆弄它)@MathieuGuindon请不要这样做。问题可能有很多答案,你的问题可能会给OP上一堂关于只允许字段中的特定字符的宝贵一课。我的问题只是教OP避免使用VBA进行简单的输入验证(Access有许多非VBA功能来验证输入).@Erik我确实在表上设置了验证,但用户抱怨应该有办法撤消更改。目前,他们只能使用Esc按钮来撤消更改,但他们通常不知道Esc按钮的用途。@WKI,如果您在字段上有格式或验证规则(如将格式设置为“常规数字”)这是问题的非常相关的信息。这将解释为什么您的代码不会触发,验证规则在 BeFurUpDebug >代码>事件触发之前被评估。您可以考虑删除控件上的验证规则,而不是在表上,以允许代码工作。注意:我不熟悉Access——应该定义。在这种情况下,您最好使用@Mathieus,我已经尝试了您的代码,但在第行中出现了一个错误:“Private Sub TextBox1_KeyPress(ByVal keyscii As MSForms.ReturnInteger)”我需要任何引用吗?@WKI“假设这是一个MSForms textbox控件”-看起来情况并非如此。我没有MS Access来测试任何东西,但我可以向您保证,此代码与
用户表单
完美配合……我猜您有一个Access表单,它似乎在使用另一种类型的控件。查看是否存在可以在sim卡中处理的
按键
按键
事件ilar way.@WKI快速搜索显示,Access表单文本框似乎有一个
KeyDown
事件,只是一个不同的签名。请参见编辑。这里有一个KeyDown,让我试试看!
    If Not IsValidKeyAscii(KeyCode, TextBox1.value) Then KeyCode = 0