文本框文本更改事件VBA表单

时间:2015-10-03 10:27:33

标签: forms vba excel-vba error-handling textbox

我有一个名为“txtEndBalance”的文本框,我希望只将数字作为数据验证的一部分插入。因此我有On Error事件。

现在我通过一个按钮启动表格。它直接转到错误,我有一个消息框弹出“无效的货币金额”。这不应该是这样的。

然后当我摆脱弹出试图输入一个数字。当我输入一位数字时,它会再次抛出该错误。

我不知道下面的代码中哪里出错了,因为我认为我做的一切都是正确的。

如果需要,请查看文件here

Private Sub txtEndBalance_Change()

    On Error GoTo Error:

    Dim amt As Currency
    amt = txtEndBalance
    txtEndBalance = Format(amt, "$##,###,##0")
    Exit Sub

Error:
        If txtEndBalance <> "$" And txtEndBalance <> "" Then
        MsgBox "Invalid currency amount", , "Error"
        txtEndBalance = Format(0, "$##,###,##0")
        End If

End Sub

2 个答案:

答案 0 :(得分:2)

这样就可以输入数字。加入此KeyPress事件。

Private Sub txtEndBalance_KeyPress(KeyAscii As Integer)

    'This is a check for backspace keypress.
    If KeyAscii = 8 Then Exit Sub

    'This will allow only numeric values in the text box.
    If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
        KeyAscii = 0
    End If
End Sub

然后您可以在更改事件中进行格式化。

答案 1 :(得分:0)

你的基本问题是amt被声明为Currency变量,而你试图从textEndBalance框中分配给它的值不是货币对象,所以你的sub抛出了类型不匹配错误,让你进入你的错误处理程序。

在表单的每个加载上发生这种情况的原因是您将加载字段txtEndBalance的值设置为命名范围的格式化版本。这会触发txtEndBalance_Change,并且在尝试将该文本框的值分配给货币变量amt时会出现类型不匹配错误。

一个简单的修复方法是更改​​将amt变量声明为匹配的方式 - Dim amt As Variant有效,或者甚至可以取消使用amt变量并使用类似txtEndBalance = Format(txtEndBalance.Value, "$##,###,##0")

的内容

另外,正如另一个答案所述,您不应该使用Error关键字作为错误处理程序的标签。