访问VBA - 使用书签删除过滤器并保持当前记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问VBA - 使用书签删除过滤器并保持当前记录相关的知识,希望对你有一定的参考价值。

在Access 2010中,我有一个表单,可以使用过滤器打开特定记录或记录:

DoCmd.OpenForm "frmStories", , , "StoryID = " & someNumber

使用下面的代码(source)让我删除过滤器并保留在当前记录...或者我认为。表单的一部分 - 即由VBA计算的字段 - 仍然认为它们在第一条记录上,使用StoryID = 1,因此显示错误的结果。

Dim varFilterID As Variant

Public Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)

    'Note current record if filter is removed
    If ApplyType = acShowAllRecords Then
        varFilterID = Me.StoryID
        Debug.Print "ApplyFilter"
    End If

End Sub

Private Sub Form_Current()        
    ' If the filter is OFF, and we have a stored ID from the filter setting,
    ' use standard bookmark code to return to the record selected for the filter.

    If Me.FilterOn = False Then
        If Nz(varFilterID) <> "" Then
            Dim rs As DAO.Recordset
            Dim strCriteria As String
            Set rs = Me.RecordsetClone
            strCriteria = "StoryID = " & varFilterID
            Debug.Print "varFilterID=" & varFilterID & " storyID = " & Me.StoryID & " 1st"
            If rs.NoMatch = False Then Me.Bookmark = rs.Bookmark
            ' Reset the stored filterID so that the code does not keep forcing this
            ' selection as the user navigates through the records.
            varFilterID = Null
            Set rs = Nothing
            Debug.Print "varFilterID=" & varFilterID & " storyID = " & Me.StoryID & " 2nd"

        End If
    End If

    'other stuff    
End Sub

单步执行代码显示它第一次运行正常,到达子结束然后再次触发Form_Current(为什么?),此时Me.StoryID恢复为1.这让我觉得问题有点问题使用事件触发顺序(ApplyFilter似乎在'当前完成后'触发''。

分页到之前的记录并重新修复它;并且当放置在命令按钮中时,代码完美地工作。

我究竟做错了什么?或者,我可以采取另一种方法吗? (我需要过滤几个非连续的记录,因此不能选择使用.FindFirst加载表单。)

ETA:我添加了一些Print.Debug行来查看发生了什么。这是结果:

ApplyType
varFilterID=35 storyID = 1 1st
varFilterID=35 storyID = 35 1st
varFilterID= storyID = 35 2nd
varFilterID= storyID = 1 2nd      <- resets between Current's End Sub and the last Current
答案

在应用oder删除过滤器后,我会尝试Me.Refresh。

另一答案

问题如下:If rs.NoMatch = False Then Me.Bookmark = rs.Bookmark在表单中移动当前记录,触发另一个Form_Current,可能触发无限循环。

您可以尝试将Form_Current的速率限制为仅每秒触发一次:

Private lastCurrent As Date
Private Sub Form_Current()
   If lastCurrent < Now() - #00:00:01# Then Exit Sub
   LastCurrent = Now()

请注意,根据代码运行的时间长短,您可能需要增加秒数。

但请注意,这很可能是一个XY问题。您可以在打开表单时移动到特定记录,而无需按以下方式应用过滤器

Dim frm As Form
Application.ScreenUpdating = False
DoCmd.OpenForm "frmStories"
Set frm = Forms!frmStories
Dim rs As RecordSet
Set rs = frm.RecordsetClone
strCriteria = "StoryID = " & someNumber
rs.FindFirst strCriteria
If rs.NoMatch = False Then frm.Bookmark = rs.Bookmark
Application.ScreenUpdating = True

实现这一目标的其他技术可能是使用OpenArgs,这是我经常使用的。

以上是关于访问VBA - 使用书签删除过滤器并保持当前记录的主要内容,如果未能解决你的问题,请参考以下文章

如何等待 Compact Repair - 访问 VBA

访问 VBA 过滤器 RecordCount 未正确更新值

使用带有 postgresql 表的 vba 填充组合框访问 2007

Word批量删除所有书签

VBA访问从级联列表框传递和编辑记录并重新查询列表框

访问当前记录上的 VBA 打开表单