运行-time error 91 VBA when trying to resolve write conflict 错误

Run-time error 91 VBA when trying to resolve write conflict error

我先声明一下我是 Access/VBA 的新手。我正在尝试为 linked SQL 服务器数据库创建一组用于在 MS Access 中输入数据的表单,以记录植被数据。我有一个带有三个未绑定控件的窗体,这些控件为子窗体中的多个记录的字段提供值。具体来说,主窗体中的三个控件分别是Transect_OID、Data_Recorder、Data_Observer。在子表单中,每个 Transect_OID 对应 30 条记录,对应于记录植物物种的横断面上的 30 个位置中的每一个。我在主窗体中添加了一些事件过程来自动填充子窗体中的相应字段,以确保整个横断面记录的一致性。但是,此设置导致写入冲突错误。在互联网上搜索修复程序后,我遵循了此 link https://www.accessrepairnrecovery.com/blog/fix-ms-access-write-conflict-error 中解决方案 #5 中的建议。当我添加建议的 OnActivate 事件过程时,我得到 运行-次错误 91“对象变量或块变量未设置。”这是我的事件过程代码:

Private Sub Form_Activate()
Dim rs As ADODB.Recordset
Set rs = Me.Recordset.Clone
rs.Open
rs.Bookmark = Me.Bookmark
DoCmd.RunCommand acCmdRefresh
Me.Bookmark = rs.Bookmark
rs.Close
Set rs = Nothing
End Sub

Private Sub Form_Deactivate()
DoCmd.RunCommand acCmdSaveRecord
End Sub

Private Sub Observer_AfterUpdate()
Me.frmLPIDetail.Form.Data_observer = Me.Observer
Me.Dirty = False
End Sub

Private Sub Recorder_AfterUpdate()
Me.frmLPIDetail.Form.Data_recorder = Me.Recorder
Me.Dirty = False
End Sub


通过研究其他 运行 次错误 91 投诉,似乎在以下情况下会抛出此错误:

  1. 没有选择合适的库作为参考。在这种情况下,它将是 Microsoft ActiveX Data Objects 2.5 Library。我已确保选中此项。

  2. 对象变量已声明但未设置。代码的第3行应该是设置的地方。但是,这是调试器抱怨的行。

  3. 一个对象变量被设置为空。倒数第二行就是这种情况,但我的理解是该行重置了对象变量

  4. With 块中的 Go To 语句。此子程序中从未调用过这些命令,因此很容易排除此原因。

我不知道为什么会这样。任何建议将不胜感激。

这个错误很简单:您尝试两次编辑同一条记录。

I have added some event procedures in the main form to autopopulate the corresponding fields in the subform to ensure consistency of records for an entire transect.

这是要更正的代码。这样做并删除 OnActive 代码。

由于您没有发布违规代码,我们无法提供进一步帮助。

此外,请使用更新的 ADO 6.1 库。


试试这个更简单的方法:

Private Sub Form_Activate()

    Dim rs As ADODB.Recordset
    Dim Id As Long

    Id = Me!Id.Value
    Me.Requery

    ' Restore previous current record.
    Set rs = Me.Recordset.Clone
    rs.Find "Id = " & Id & ""
    Me.Bookmark = rs.Bookmark
    rs.Close

End Sub


Private Sub Form_Deactivate()

    DoCmd.RunCommand acCmdSaveRecord

End Sub


Private Sub Observer_AfterUpdate()

    Me!frmLPIDetail.Form!Data_observer.Value = Me!Observer.Value
    Me.Dirty = False

End Sub


Private Sub Recorder_AfterUpdate()

    Me!frmLPIDetail.Form!Data_recorder.Value = Me!Recorder.Value
    Me.Dirty = False

End Sub

首先是写入冲突:

事实证明,我的问题源于我在该表单的控件源 table 中有位数据类型字段这一事实。显然,如果来自 linked SQL 服务器数据库的位字段为空,Access 会以某种方式将它们转换为 0,从而导致写入冲突。在SQL中,我把所有记录的值都改成了0,这样就解决了写冲突的问题。

第二个运行时错误代码 91: 这是因为我试图使用 link 在我关于主窗体的原始问题中建议的解决方法,这不是写冲突的根源。当我将原始代码添加到子表单并将其从主表单中删除时,运行时错误 91 消失了。