在我正在修改的Microsoft Access应用程序中,某些vba函数会返回消息:
"Record is Deleted"
此消息显示在消息框中,没有错误编号和黄色警告图标。
这不是传统错误处理可以捕获的错误(“出错时......”。它也不受DoCmd.setwarnings = false
的影响我正在寻找关于如何捕获或处理此项目的一些建议。
答案 0 :(得分:2)
“删除记录”是运行时错误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
。这可以解释你描述的行为。
答案 1 :(得分:1)
也许您从多个表中删除记录...例如
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)。