【问题标题】:Run-time error 91 VBA when trying to resolve write conflict error尝试解决写入冲突错误时出现运行时错误 91 VBA
【发布时间】:2021-11-22 17:02:23
【问题描述】:

我将以我是 Access/VBA 的新手这一事实作为开头。我正在尝试为链接的 SQL Server 数据库在 MS Access 中创建一组用于数据输入的表单,以记录植被数据。我有一个带有三个未绑定控件的表单,它们为子表单中的多个记录的字段提供值。具体来说,主窗体中的三个控件分别是Transect_OID、Data_Recorder和Data_Observer。在子表单中,每个 Transect_OID 对应于 30 条记录,对应于沿样带记录植物物种的 30 个位置中的每一个。我在主窗体中添加了一些事件过程来自动填充子窗体中的相应字段,以确保整个样带记录的一致性。但是,此设置导致写入冲突错误。在搜索互联网进行修复后,我遵循了此链接 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 数据对象 2.5 库。我已确保已选择此选项。

  2. 对象变量已声明但未设置。代码的第 3 行应该是它的设置位置。然而,这是调试器抱怨的那一行。

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

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

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

【问题讨论】:

    标签: ms-access runtime-error ado


    【解决方案1】:

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

    我在主窗体中添加了一些事件过程来自动填充 子表单中的相应字段,以确保一致性 整个样带的记录。

    这是要更正的代码。这样做并删除 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
    

    【讨论】:

    • 您好古斯塔夫,感谢您的回复。我已经用该表单的整个代码编辑了我的问题。我不确定要删除什么,因为该代码是我的 OnActivate 代码。
    • 感谢更新版本。我试过了,虽然它停止了运行时错误 91 消息,但我现在收到运行时 94 错误“无效使用 NULL”。我认为这会被抛出,因为另一个表单上的命令按钮的“点击”事件过程填充了 id 字段。我尝试将两个 dim 命令下方的所有内容包装在 IF Not IsNULL / End IF 中,这抑制了运行时错误 94,但随后再次抱怨写入冲突。
    【解决方案2】:

    首先是写冲突:

    事实证明,我的问题源于我在此表单的控制源表中有位数据类型字段。显然,如果来自链接 SQL Server 数据库的位字段为空,Access 会以某种方式将它们转换为 0,这会导致写入冲突。在 SQL 中,我将所有记录的值更改为 0。这样就解决了写冲突问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多