在Access窗体中,如何在重新查询后返回到上一个记录

时间:2010-03-11 15:45:57

标签: ms-access vba

这应该很简单。该表格由[Dismissed] =“N”过滤。当用户单击“关闭”按钮时,[Dismissed]字段将更改为“Y”。在重新查询之后,表单应该返回到用户之前所在的同一行。

Private Sub DismissButton_Click()
   Me!Dismissed = "Y"
   MsgBox "Dismissed!", vbOKOnly
   Dim GoBackToThisRecord As Integer
   GobacktothisRecord = Me.CurrentRecord
   Me.Requery
   Set Me.CurrentRecord=GoBackToThisRecord
End Sub

但是,即使内置帮助文件说CurrentRecord是一个读/写属性,我在最后一行得到“无效使用属性”错误消息。

设置[Dismiss] =“Y”并重新查询表单后,如何让用户返回他/她之前在表单中的位置?

4 个答案:

答案 0 :(得分:2)

我不明白如果表单被过滤到编辑记录不再匹配的值,您的解决方案如何工作 - 如果您在[Dismissed] =“N”上进行过滤,然后更改当前记录的Dismissed字段到Y应该使重新获得的表单排除您刚刚更新的记录。

除此之外,我永远不会按照你的方式去做,因为Me.CurrentRecord返回一个代表记录中位置的数字。由于重新查询可能导致记录数量发生变化(例如,其他人编辑或添加或删除记录导致其被包含在表单的记录集中或从表单的记录集中排除)以及所需记录的位置发生变化,我会使用而不是PK。

  Dim lngPK as Long

  lngPK = Me!MyPKID
  Me.Requery
  With Me.RecordsetClone
    .FindFirst "[MyPKID]=" & lngPK
    If Not .NoMatch Then
       If Me.Dirty Then
          Me.Dirty = False
       End If
       Me.Bookmark = .Bookmark
    End If
  End With

这不会涉及过滤器问题,但我把它放在一边,因为它似乎不是我认为它来自原始问题描述的问题。

答案 1 :(得分:1)

没关系。我自己修好了。最后一行是:

Me.Recordset.Move GoBackToThisRecord

答案 2 :(得分:1)

移动到上一条记录的正确方法,无论是否是新记录,都是

Me.Recordset.Move GoBackToThisRecord -1

答案 3 :(得分:1)

我使用这个功能:

Public Sub RequeryFormAndKeepCurrentlySelectedRecord(f As Form)
Dim Position As Long
  Position = f.CurrentRecord
  f.Requery
  If Position > 1 Then
    f.Recordset.move Position - 1
  End If
End Sub