如何在不调用_Change函数的情况下清除userform文本框?

时间:2015-11-11 13:25:49

标签: vba excel-vba userform excel

我在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

7 个答案:

答案 0 :(得分:2)

实现此目的的一种简单方法是使用_Exit()函数: Private Sub TextBox1_Exit(ByVal取消为MSForms.ReturnBoolean) 如果不是IsNumeric(TextBox1.Value)那么         MsgBox“请仅输入数值。”,vbCritical,“错误” 万一 结束子 一旦文本框失去焦点,就会触发此操作。

答案 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;可能会有所不同,取决于你问的是谁,但希望我能给你一些思考的食物。