Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问VBA-使用书签删除筛选器并保留当前记录_Ms Access_Vba_Ms Access 2010_Recordset - Fatal编程技术网

Ms access 访问VBA-使用书签删除筛选器并保留当前记录

Ms access 访问VBA-使用书签删除筛选器并保留当前记录,ms-access,vba,ms-access-2010,recordset,Ms Access,Vba,Ms Access 2010,Recordset,在Access 2010中,我有一个表单,可以使用过滤器打开特定记录: DoCmd.OpenForm "frmStories", , , "StoryID = " & someNumber 使用下面的代码,我可以删除过滤器并保留在当前记录上。。。至少我是这么想的。表单的某些部分(即VBA计算的字段)仍然认为它们位于第一条记录上,使用StoryID=1,因此显示错误的结果 Dim varFilterID As Variant Public Sub Form_ApplyFilter(Ca

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

DoCmd.OpenForm "frmStories", , , "StoryID = " & someNumber
使用下面的代码,我可以删除过滤器并保留在当前记录上。。。至少我是这么想的。表单的某些部分(即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
Dim varFilterID作为变量
公共子表单\u ApplyFilter(取消为整数,ApplyType为整数)
'如果删除筛选器,请注意当前记录
如果ApplyType=acShowAllRecords,则
varFilterID=Me.StoryID
调试。打印“ApplyFilter”
如果结束
端接头
私有子表单_当前()
'如果过滤器处于关闭状态,并且我们从过滤器设置中存储了一个ID,
'使用标准书签代码返回为筛选器选择的记录。
如果Me.FilterOn=False,则
如果Nz(varFilterID)“,则
Dim rs作为DAO.Recordset
作为字符串的Dim strCriteria
设置rs=Me.RecordsetClone
strCriteria=“StoryID=”&varFilterID
Debug.Print“varFilterID=“&varFilterID&”storyID=“&Me.storyID&”1st”
如果rs.NoMatch=False,则Me.Bookmark=rs.Bookmark
'重置存储的filterID,以便代码不会一直强制执行此操作
'在用户浏览记录时进行选择。
varFilterID=Null
设置rs=无
Debug.Print“varFilterID=“&varFilterID&”storyID=“&Me.storyID&”第二个”
如果结束
如果结束
“其他东西
端接头
单步执行代码表明,它第一次工作正常,到达sub的末尾,然后在再次触发Form_Current时重新启动(为什么?),此时Me.StoryID恢复为1。这使我认为问题与事件触发顺序有关(ApplyFilter似乎在当前结束后触发)

分页到上一条记录并反向修复它;当放置在命令按钮中时,代码可以完美地工作

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

ETA:我添加了一些打印调试行以查看发生了什么。结果是:

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
ApplyType
varFilterID=35 storyID=1
varFilterID=35故事ID=35第一
varFilterID=storyID=35秒

varFilterID=storyID=1nd我会在应用或删除过滤器后尝试使用Me.Refresh。

问题如下:
如果rs.NoMatch=False,那么Me.Bookmark=rs.Bookmark
移动表单中的当前记录,触发另一个
表单\u current
,可能触发无止境循环

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

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

实现这一点的进一步技术可能是使用我经常使用的
OpenArgs

Current不会永远循环,但在循环的后半部分的某个点上,
StoryID
会变回
StoryID=1
,我很难准确地确定发生的位置。(我使用过滤器而不是FindFirst,因为有时我想打开一组记录。用户可以在它们之间来回翻页,然后如果他们想继续以通常的方式浏览表单,就删除过滤器。)埃塔:我确实尝试过限速,但没有效果-StoryID仍然恢复为1。
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