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 属性?