我在Excel中有一个userform,其文本框仅用于数字数据。我想在检测到错误输入时清除文本框并提供错误消息,但我不想再次调用文本框的_Change函数,否则消息会弹出两次,因为我将文本更改为"&#34 ;.我没有看到内置的清晰功能..有更好的方法吗?
Private Sub txtbox1_Change()
txt = userform.txtbox1.Value
If Not IsNumeric(txt) Then
disp = MsgBox("Please only enter numeric values.", vbOKCancel, "Entry Error")
txtbox1.Text = ""
End If
End Sub
答案 0 :(得分:2)
答案 1 :(得分:1)
阻止用户输入Alpha字符:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc("0") To Asc("9")
Case Asc("-")
If Instr(1,Me.TextBox1.Text,"-") > 0 Or Me.TextBox1.SelStart > 0 Then
KeyAscii = 0
End If
Case Asc(".")
If InStr(1, Me.TextBox1.Text, ".") > 0 Then
KeyAscii = 0
End If
Case Else
KeyAscii = 0
End Select
End Sub
希望这有帮助! -Hugues
答案 2 :(得分:1)
您可以这样做,如here
所示Private Sub TextBox1_Change()
OnlyNumbers
End Sub
Private Sub OnlyNumbers()
If TypeName(Me.ActiveControl) = "TextBox" Then
With Me.ActiveControl
If Not IsNumeric(.Value) And .Value <> vbNullString Then
MsgBox "Sorry, only numbers allowed"
.Value = vbNullString
End If
End With
End If
End Sub
答案 3 :(得分:1)
您可以在最开始添加此行
sub txtbox1_Change()
If txtbox1.Text = "" Or txtbox1.Text = "-" Then Exit Sub '<~~~
或者,我发现这更短更有趣:
Private Sub txtbox1_Change()
If Not IsNumeric(txtbox1.Text & "0") Then
disp = MsgBox("Please only enter numeric values.", vbOKCancel, "Entry Error")
txtbox1.Text = ""
End If
End Sub
有趣的是,它接受输入“.2”,“ - 3.2”以及“5e3”之类的内容,其他方法不允许最后一种情况!
将其转换为while循环只能删除最后输入的错误字符:
Private Sub txtbox1_Change()
t = txtbox1.Text
Do While t <> "" And Not IsNumeric(t) And Not IsNumeric(t & "0")
t = Mid(t, 1, Len(t) - 1)
Loop
txtbox1.Text = t
End Sub
答案 4 :(得分:0)
似乎因为没有内置可以做我想要的东西,这将是处理问题的最简单方法:
Private Sub txtbox1_Change()
txt = userform.txtbox1.Value
If (Not IsNumeric(txt)) And (txt <> "") Then
disp = MsgBox("Please only enter numeric values.", vbOKCancel, "Entry Error")
txtbox1.Text = ""
End If
End Sub
答案 5 :(得分:0)
声明一个全局布尔值,并在每个子句的开头添加一个if语句,如果布尔值为true,则退出子语句。当您收到错误消息时,将值设置为true,不会发生任何事情。然后再次将其设置为false。
Dim ufEventsDisabled As Boolean
Private Sub txtbox1_Change()
'repeat the following line everywhere that you don't want to update
if ufeventsdisabled then exit sub
txt = userform.txtbox1.Value
If Not IsNumeric(txt) Then
disp = MsgBox("Please only enter numeric values.", vbOKCancel, "Entry Error")
ufeventsdisabled = true
txtbox1.Text = ""
ufeventsdisabled = false
End If
End Sub
*积分来自mrexcel.com
的mikerickson答案 6 :(得分:0)
您无法停止_Changed事件的触发。我建议您在设计中备份几个步骤,并询问您是否可以在不首先清除它的情况下完成工作。在FoxPro中,我们将设置&#39;格式&#39;到9999.99并且它会自动阻止用户输入字母字符,但我认为特定字段是FP独有的。您可以挂钩_Changed事件并在那里执行自己的验证。我建议不要过滤单个击键,但每次更改时都要验证整个值。
If Text1.Value <> str(val(Text1.Value)) Then
Text1.Value = previousValue
EndIf
...这需要保留前一个值的备份变量,但我相信你能搞清楚。可能存在某些边缘情况,其中VB的字符串数字转换函数并不完全匹配,如您所提到的指数表示法,因此您可能需要更复杂的检查。无论如何,这将使得甚至无法输入坏的价值。它还提供更好的用户体验,因为反馈更直接,更直观。您可能会注意到_Changed事件中的值正在被更改,这会在您的脑海中产生关于无限循环的膝盖反射红旗。如果这样做,请确保您的先前值已经过验证,请记住初始值将是一个空字符串。因此,递归调用将跳过If块,从而终止循环。在任何情况下,你会考虑什么&#34;更好&#34;可能会有所不同,取决于你问的是谁,但希望我能给你一些思考的食物。