【问题标题】:Error on textbox text change event VBA form文本框文本更改事件 VBA 表单上的错误
【发布时间】:2015-12-31 12:13:01
【问题描述】:

我有一个名为“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

【问题讨论】:

  • 我没有收到错误,当用户窗体显示时,如果我在文本框中输入文本而不是数字,我只会收到错误,单击命令按钮时也会收到错误,如它试图找到一个子函数。

标签: forms vba excel error-handling textbox


【解决方案1】:

这将使只能输入数字。放入这个 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

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

【讨论】:

  • 这也将允许删除On Error GoTo Error 和不当使用Error 关键字作为标签
【解决方案2】:

您的基本问题是 amt 被声明为 Currency 变量,并且您尝试从 textEndBalance 框中分配给它的值不是 Currency 对象,因此您的 sub 抛出类型不匹配错误并将您放入您的错误处理程序。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2016-02-09
    • 1970-01-01
    • 2017-05-07
    • 2014-09-05
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多