MS Access——在子表单上快速过滤,然后将过滤器传递给报表

MS Access -- quick filter on a subform, then pass the filter to a report

我有一个带有子表单 (frmDocumentDatasheet) 的表单 (frmDocumentList) 和一个打开报告 (rptDocumentList) 的打印按钮。

我只想在子表单上使用 "quick filter function"(排序和筛选功能区)。然后将过滤后的数据传递给报表。

目前报告包含所有数据。

我认为这是一个简单的问题,但我的atm 无法解决它。我有 vba 的经验。 希望有人能帮助我。 -对不起我的英语不好-

这是我试过的vba:

 Private Sub Command17_Click()

If Not IsNull(Me.Form![Document Datasheet].[Filter]) Then
    DoCmd.OpenReport "RptDocumentList", A_PREVIEW, , Me.Form![Document Datasheet].Filter
Else
    MsgBox "Apply a filter to the form first"
End If
End Sub

我的问题是我在子表单上使用的快速过滤器不适用于报表。

如果您的命令按钮在主窗体上,那么您需要一个不同的过滤器:您需要子窗体上的过滤器。类似于:

Option Explicit  ' <- be sure this is at top of module
                 ' ...and run Debug>Compile so it can perform its check

'' And on your button click event:
Private Sub Command17_Click()
    Dim strFilter as String
    strFilter = Me.Form![Document Datasheet].[Filter]
    Debug.Print strFilter
    If strFilter <> "" Then
        DoCmd.OpenReport "RptDocumentList", A_PREVIEW, , strFilter
    Else
        MsgBox "Apply a filter to the form first"
    End If
End Sub

只需引用子窗体的 名称 -- 即在主窗体上看到的控件名称。更多 here.

使用像 strFilter 这样的变量有望为您提供更多控制,以便您可以看到正在发生(或未发生)的事情。

Debug.Print 命令会导致您的过滤器字符串出现在立即 window 中。如果您对此不熟悉,我建议您做一些研究,因为它无疑会对您有所帮助。一方面,您可以 post 输出——也许是您的字符串出了问题。

您会注意到我的代码测试了一个空字符串 ("")。可能您的过滤器是空字符串,IsNull() 测试无法帮助您检测到这一点。