【问题标题】:trap access vba messages陷阱访问 vba 消息
【发布时间】:2016-12-11 14:08:35
【问题描述】:

经过一段时间做其他事情后,我正在 Access 2007 中进行开发,并试图将消息捕获给用户。表单中的一个函数修改表中的一行。代码的相关位是

On Error GoTo PROC_ERR
...
DoCmd.RunSQL szSQL
...
PROC_ERR:
  MsgBox "Error: (" & Err.Number & ") " & Err.Description, vbCritical

SQL 语句正确,系统弹出“您即将更新 1 行...”消息(编号 10505)。我想捕获它并用我自己的警告消息替换它。但是,我的函数不会在此消息上捕获错误。如果用户单击“否”,它也不会对出现的消息执行此操作:“运行时错误 2501。RunSQL 操作已取消。”

在 VBA 选项中,我暂时将错误捕获设置为“中断所有错误”。

我在这里缺少什么?我是否未能在 Access 中设置其他选项?

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    我建议不要使用RunSQL。它需要DoCmd.SetWarnings False,如果它后面没有DoCmd.SetWarnings True,可能会影响进一步的警告,例如在错误之后。此外,您将无法读取受影响行的数量。 使用

    db.Execute szSQL, dbFailOnError
    

    相反,它将允许在查询执行后捕获错误并分析数据库状态。如果没有dbFailOnError 选项,将不会引发错误。

    【讨论】:

    • 是的,我很高兴了解到 db.Execute。但是我的功能仍然没有捕获诸如 3200 一条“记录不能删除或更改”之类的错误。对此的任何帮助都会阻止我沮丧地撕扯我的头发。如果您需要函数的完整代码,而不是我之前发布的 sn-p,我可以提供。
    • 您的代码有问题。请提供。关于替换 10505 之类的消息 - 在执行 SQL 之前使用您自己的消息框
    【解决方案2】:

    该消息不是错误。

    你可以用

    让它静音
     DoCmd.SetWarnings False
    

    记得重新设置它们。

    【讨论】:

    • 很公平。但我认为,当消息出现在 MS Access 错误消息的标准列表中时,它是可以捕获的,就好像它是一个错误一样。另一个错误(2501)呢?那不应该被困住吗?
    • 是的,很容易 - 但您也可以将 DoCmd.RunSQL 替换为 CurrentDb.Execute 以快速通过。
    • 感谢您指出替代功能。没有侵入性消息,它可以很好地工作。但是我刚刚尝试使用删除查询,但由于关系问题而失败;它会引发 3200 错误“无法删除或更改记录”。就像 2501 错误一样,这不会被我的错误处理程序捕获。很抱歉一直向您施压,但我似乎严重误解了错误处理!
    • 好吧,那么您将不得不调整您的错误处理程序以礼貌地处理此错误和其他选定的错误。周围有很多示例供浏览。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多