在我正在修改的 Microsoft Access 应用程序中,某些 vba 函数会返回以下消息:
"Record is Deleted"
这将出现在一个没有错误号和黄色警告图标的消息框中。
这不是可以被传统错误处理捕获的错误(“on error...”。它也不受 DoCmd.setwarnings=false 的影响
我正在寻找有关如何捕获或处理此项目的一些建议。
“记录已删除”是运行时错误 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
如果您运行该代码,然后在显示时“从其下删除记录”,则在 中的rst!
引用Debug.Print
会触发运行时错误 3167 并On Error
捕获它。
检查您的代码以查看是否有一个活动的On Error
(可能在较早的调用过程中声明)仅显示MsgBox
带有Err.Description
. 这可以解释你描述的行为。
也许您从多个表中提取要删除的记录...例如
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
这将在第二个 Delete 行失败,因为 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)。