Microsoft Access VBA 中的记录已删除消息

Posted

技术标签:

【中文标题】Microsoft Access VBA 中的记录已删除消息【英文标题】:Record Is Deleted message in Microsoft Access VBA 【发布时间】:2013-08-07 00:38:10 【问题描述】:

在我正在修改的 Microsoft Access 应用程序中,某些 vba 函数返回消息:

"Record is Deleted"  

这出现在一个没有错误号和黄色警告图标的消息框中。

这不是传统错误处理可以捕获的错误(“on error...”。它也不受 DoCmd.setwarnings=false 影响

我正在寻找一些关于如何捕获或处理此物品的建议。

【问题讨论】:

【参考方案1】:

“记录已删除”是运行时错误 3167,可以使用正常的On Error 处理来捕获它。这可以通过 VBA 代码进行验证,如下所示:

Sub foo()
Dim cdb As DAO.Database, rst As DAO.Recordset
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset("SELECT * FROM Table1 WHERE ID=26", dbOpenDynaset)
MsgBox "Waiting..."
On Error GoTo foo_Error
Debug.Print rst!ID
On Error GoTo 0
rst.Close
Set rst = Nothing
Set cdb = Nothing
Exit Sub
foo_Error:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly, "Trapped Error"
End Sub

如果您运行该代码,然后在显示 MsgBox 时“从其下删除记录”,则 Debug.Print 中的 rst! 引用会触发运行时错误 3167 和 On Error 捕获它。

检查您的代码以查看是否有一个活动的On Error(可能在之前的调用过程中声明)只是简单地显示带有Err.Description 的普通MsgBox。这可以解释你描述的行为。

【讨论】:

【参考方案2】:

也许你从多个表中拉出一条记录来删除……比如

sql = "SELECT columnA FROM tableA WHERE criteria"
set rec = currentdb.openrecordset(sql)

DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec(0)
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec(0)
DoCmd.SetWarnings True

这将在第二行删除失败,因为第二行不再存在 rec(0),您只是从 tableA 中删除了它,这是您的记录集的来源。

然而,

DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec(0)
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec(0)
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec(0)
DoCmd.SetWarnings True

会起作用。这可能不是最佳实践方法,但如果您遇到此错误,请尝试此操作,看看是否是记录集被删除的原因。

更好的方法可能是声明一个变量并将 rec(0).value 分配给该变量。然后在代码中使用变量代替rec(0)。

【讨论】:

以上是关于Microsoft Access VBA 中的记录已删除消息的主要内容,如果未能解决你的问题,请参考以下文章

打印前在 Microsoft Access 报告中运行 VBA

如何在 Microsoft Access 的不同上下文中使用 VBA 中的参数?

我可以从 Microsoft Access VBA 中的当前事件堆栈返回吗?

有啥方法可以使用 VBA 更改 Microsoft Access 中表单上的 PopUp 属性?

Microsoft Access,计算 - 文本框控件源与 VBA 函数

使用 VBA 在 Access 2010 中的表单上显示记录集