Ms access 开始出现运行时错误';3159';;Access 2007中突然出现无效书签

Ms access 开始出现运行时错误';3159';;Access 2007中突然出现无效书签,ms-access,ms-access-2007,Ms Access,Ms Access 2007,我对编程访问非常陌生。我将一个旧的97 access db转换为access 2007,它已经正常工作了一段时间。今天我走进它,在设计视图中四处窥探,查看代码。我没有改变任何事情。只是看看。当我去运行代码时,我不断地得到“notavailablebookmark”错误。只是为了确保我打开了我转换的旧程序,所有的代码都是一样的,这一行给我的问题是 Me.Bookmark=pos 以下是整个程序 提前谢谢 Private Sub ProductID_AfterUpdate() Dim pos

我对编程访问非常陌生。我将一个旧的97 access db转换为access 2007,它已经正常工作了一段时间。今天我走进它,在设计视图中四处窥探,查看代码。我没有改变任何事情。只是看看。当我去运行代码时,我不断地得到“notavailablebookmark”错误。只是为了确保我打开了我转换的旧程序,所有的代码都是一样的,这一行给我的问题是

Me.Bookmark=pos

以下是整个程序

提前谢谢

Private Sub ProductID_AfterUpdate()
    Dim pos As Variant
    Me![UnitPrice] = Me![ProductID].Column(2)
    Me![ProductName] = Me![ProductID].Column(1)
    Me![GLAcct] = Me![ProductID].Column(3)
    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
    pos = Me.Bookmark
    Me.Requery
    Me.Bookmark = pos
End Sub

编辑:我已经尝试过压缩和修复。

您需要更改此代码,因为它已经过时一段时间了。我不知道为什么它在第一时间起作用,因为书签在更新、保存和重新查询后会发生变化。我已经对重新查询行进行了注释,因为它似乎没有什么用处,如果您希望更新组合,请重新查询该行。如果希望在操作后查找记录,请将唯一ID保存到变量并查找它。DoMenuItem已弃用,您可以改用RunCommand,但在本例中,Me.Dirty=false将保存

Private Sub ProductID_AfterUpdate()
    Dim pos As Variant
    Me![UnitPrice] = Me![ProductID].Column(2)
    Me![ProductName] = Me![ProductID].Column(1)
    Me![GLAcct] = Me![ProductID].Column(3)
    Me.Dirty=False
    'pos = Me.Bookmark
    'Me.Requery 
    'Me.Bookmark = pos
End Sub

要重新查询表单并返回到同一记录,请执行以下操作:

  Dim lngPKValue As Long

  With Me.RecordsetClone
    lngPKValue = Me!ID
    ' Me.Dirty = False is unnecessary, as the Requery saves the data
    Me.Requery
    .FindFirst "[ID]=" & lngPKValue
    If Not .NoMatch Then
       Me.Bookmark = .Bookmark
    End If
  End With
现在,您将此代码放在何处取决于。我不太明白在原始代码中为什么需要重新查询,因为已经对您已经打开的记录进行了更新,所以重新查询并返回到您开始使用的记录并没有真正完成任何事情。但在某些情况下,您可能会希望这样做(例如,在一个有序记录集中,您编辑了一些值,这些值将更改此特定记录在排序结果中的位置),上述方法就是这样做的


如果有必要,您可能希望关闭表单的绘制(设置书签后,Me.painting=False,Me.painting=True)或应用程序的绘制(application.Echo=False/True),这样屏幕不会闪烁,也不会看到重新查询和导航。但请确保添加了错误处理程序,因为如果在关闭屏幕绘制时发生错误,您的用户可能会被卡住而无法继续。

它不起作用的原因是重新查询会使所有书签无效。我对access 97和2007编程非常陌生。.Bookmark的具体功能是什么?书签与物理书签类似,它标记“页面”(记录),但是,重新查询和插入记录会改变“页面”的位置,因此书签不再有效。您可以在重新查询之前保存唯一id,然后再次查找。如果这是您想要做的,请添加另一条评论。那么,通过此程序查找所有使用书签和重新查询的位置并替换为我是否安全。Dirty=False?基本上,任何时候保存书签供以后使用,您都会处于危险中,因为书签是易失性数据,仅在创建它们的上下文中有效(通过重新查询销毁)。在14年的Access编程中,我从来没有保存过书签,因为我唯一使用它们的目的是通过表单的Recordsetclone进行导航,您可以在一行上将表单的书签设置为Recordsetclone的书签。但是为什么要重新查询呢?据我所知,数据正在写入表单(Me![UnitPrice]=Me![ProductID]。第(2)列),因此不需要重新查询。当表单未被重新查询时,可能需要保存。是的,我说我认为不需要重新查询,但提供了一个理由(排序顺序)。是否需要在没有重新查询的情况下进行保存将完全取决于调用代码的上下文,对此我们一无所知。