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