Ms access Access 2010-错误处理筛选器子窗体

Ms access Access 2010-错误处理筛选器子窗体,ms-access,vba,ms-access-2010,filtering,Ms Access,Vba,Ms Access 2010,Filtering,如果筛选后没有记录,如何使用VBA禁用Datagridview的筛选 以下是我的第一次尝试: Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer) If Me.RecordsetClone.RecordCount = 0 Then MsgBox ("Kein Datensatz gefunden. Filter wird entfernt.") Me.Form.Filte

如果筛选后没有记录,如何使用VBA禁用Datagridview的筛选

以下是我的第一次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    If Me.RecordsetClone.RecordCount = 0 Then
        MsgBox ("Kein Datensatz gefunden. Filter wird entfernt.")
        Me.Form.FilterOn = False
        Me.Form.Requery
    End If
End Sub
这里是第二次尝试:

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Dim rs As DAO.Recordset

    Set rs = Me.RecordsetClone
    rs.Filter = Replace(Me.Filter, "[Tabelle1].", "")
    Set rs = rs.OpenRecordset()

    If rs.EOF Then
        Cancel = True
    End If
End Sub
在第二个代码中,我得到了错误3061。第一个代码“工作”,但最终不是我想要的

因为:

我有三张表格。主、辅1和辅2

主要有Sub1、Sub2和一个文本框。文本框称为“psoudoID”。Sub1是显示不同记录集详细信息的标准格式,位于主记录集的顶部。Sub1下面是Sub2。Sub2是一个Datagridview。当用户单击Sub2上的记录集时,ID从Sub2“转到”psoudoID,然后从那里转到Sub1。你明白吗

现在的问题是,用户可以过滤Datagrid中的每一列,以找到此处需要的记录集,并显示上面的所有详细信息。但是,当数据网格在过滤后为空时,因此Sub2不能给psoodoid提供一个ID,因此Sub1在MAIN中不再显示。那个地方的屏幕是空的。通过单击网格中的过滤器按钮,Sub1再次出现在屏幕上

我想通过单击MsgBox的“确定”或自动禁用过滤器,而不是单击gridview上的过滤器按钮

我希望你能理解我的描述。对不起,我的英语不好:-)

THX


Vegeta

我相信您在过滤器为空以及在实际应用过滤器之前使用Me.Filter时遇到了问题。此外,将对象重新指定给其自身的属性/成员之前也给我带来了问题,所以我尽量避免这样做

以下方面应起作用:

Dim strOldFilter As String
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
    Me.TimerInterval = 50
    strOldFilter = Nz(Me.Filter, "")
End Sub

Private Sub Form_Timer
        Me.TimerInterval = 0
        If Me.Filter = strOldFilter Then Exit Sub
        Dim rs As DAO.Recordset
        Dim strFilter As String
        strFilter = Nz(Me.Filter, "")
        If strFilter = "" Then
            'Handle this specific scenario
             Exit Sub
        End if
        Set rs = Me.RecordsetClone
        rs.Filter = Replace(strFilter, "[Tabelle1].", "")
        Dim rsf as DAO.Recordset
        Set rsf = rs.OpenRecordset

        If rsf.EOF Then
            Me.Filter = strOldFilter
        End If
End Sub

请注意,如果将一个导致0条记录的筛选器更改为另一个导致0条记录的筛选器,则可能会导致每50毫秒重复一次的无限循环(但如果函数工作,则您不应该让一个导致0条记录的筛选器)

第一次尝试中的哪一行会产生错误3061?您将
Me.FilterOn
设置为
False
或修改筛选器而不是将
Cancel
设置为
True
有什么原因吗?(
Cancel
取消当前筛选操作并恢复到上一个筛选(如果有),而
Me.FilterOn=False
关闭筛选,
Cancel
似乎适合您所需)第一个代码工作。但我不能在正确的地方“开火”。第二个代码出现错误3061。在替换处。尝试将
Set rs=rs.OpenRecordset()
替换为
Dim rsf As Recordset\uset rsf=rs.OpenRecordset
。这有帮助吗?我试过了,但仍然出现错误3061。
rs.Filter=Replace(CStr(Nz(Me.Filter),“[Tabelle1]”,“)
help?这样您就可以确保Replace得到3个字符串,并且没有空值。错误不再出现。但是循环你写的东西需要时间。我测试一下,然后给你们答案。太赫兹,这太混乱了!当我使用这两个代码时,它使用正确的值(用户筛选到现有记录集)。但是当我用错误的值过滤时,就没有访问消息了!网格只是空的。当我只使用你的第二个代码时。当我按一个不存在的值进行筛选时,会出现一个访问消息。但是,当我将值重新写入一个适当的值时,会出现一个时间延迟,访问消息会一次又一次地出现。看看你的第二个代码,你必须把“…退出函数”改成“…退出子函数”。你对
退出函数的理解是正确的,它应该是
退出子函数。修复后有错误吗?没有错误。现在我知道了。它的工作,但我必须点击“取消”访问消息(请输入一个正确的值…对不起,我只有德国消息)。在那之后它就开始工作了。但如果我可以输入新值,而不必单击“取消”,那就更好了。还有其他想法吗?请在留言上具体说明。它是一般错误消息还是VBA错误消息?如果是VBA,它发生在哪一行,错误代码是什么;如果是Access,则尝试指定源(如果您有一个接受参数的筛选器,则可能发生这种情况,您应该尝试调整筛选器)