过滤报告

时间:2016-03-10 14:29:03

标签: vba ms-access access-vba

我创建了一个表单,希望为用户提供筛选报告的选项。表单中有用于选择选项的列表框,一个过滤按钮和一个清除按钮。在表单的底部,我添加了子报表,以便它可以根据过滤条件进行更新。如何在代码中调出子报表以便过滤?如果我直接在Report![List]的报表上执行此操作,但它不会在窗体子报表上更新。我也没有在过滤时显示所有记录,因为由于If Len(strSubsystem) = 0 Then strSubsystem = "Like '*'"语句而不会出现具有空白的两个标准之一的记录。除了"like '*'"之外,我还可以使用另一个声明来显示所有记录。

这是代码

Private Sub cmdApplyFilter_Click()
     Dim varItem As Variant
     Dim strSubsystem As String
     Dim strStatus As String
     Dim strFilter As String

' Build criteria string from subsystem listbox
    For Each varItem In Me.lstSubsystems.ItemsSelected
         strSubsystem = strSubsystem & ",'" & Me.lstSubsystems.ItemData(varItem) _
         & "'"
     Next varItem
     If Len(strSubsystem) = 0 Then
         strSubsystem = "Like '*'"
     Else
         strSubsystem = Right(strSubsystem, Len(strSubsystem) - 1)
         strSubsystem = "IN(" & strSubsystem & ")"
     End If
' Build criteria string from status listbox
    For Each varItem In Me.lstStatus.ItemsSelected
         strStatus = strStatus & ",'" & Me.lstStatus.ItemData(varItem) _
         & "'"
     Next varItem
     If Len(strStatus) = 0 Then
         strStatus = "Like '*'"
     Else
         strStatus = Right(strStatus, Len(strStatus) - 1)
         strStatus = "IN(" & strStatus & ")"
     End If

' Build filter string
    strFilter = "[Subsystem] " & strSubsystem & _
                 " AND [Status] " & strStatus

' Apply the filter and switch it on
    With Forms![Filter]
         .Filter = strFilter
         .FilterOn = True
     End With
End Sub

2 个答案:

答案 0 :(得分:1)

如果报表是作为子表单嵌入的,并且在主表单打开时总是出现,则不需要检查报表是否打开。打开父窗体时子窗体会自动打开,因此除非有关闭它的内容,否则您不需要检查。引用子表单时,您应该使用[Forms]!集合,而不是[Reports]!集合。查看this page以获取有关引用子表单对象的帮助。

我对表单的结构并不完全清楚,但引用可能是:

[Forms]![Filter]!SubFormControlNameHere.Report.Filter

答案 1 :(得分:0)

您需要做的第一件事是找到包含报告的子窗体控件的名称。如果在表单位于设计视图中时难以找到该名称,请从“立即”窗口中检查表单的控件。 ( Ctrl + g 将带您进入立即窗口。)

这是我的表格的一个例子......

for each ctl in Forms!Form10.controls : ? ctl.name, TypeName(ctl) : next
subReport     SubForm
Label0        Label
txtSort          TextBox
Label2        Label

所以我的子窗体控件名为 subReport

我拥有该名称后,可以将表单切换回表单视图,并使用子表单控件中包含的Filter的{​​{1}}属性...

Report

立即过滤报告以仅显示一个匹配的行。

之后,我关闭了过滤器,但报告显示没有改变,直到我调用Forms!Form10!subReport.Report.filter = "id=5" Forms!Form10!subReport.Report.filteron = true (在子窗体控件上)...

Requery

如果我想从父窗体上包含的命令按钮的click事件进行过滤,我可以快捷方式控制名称......

Forms!Form10!subReport.Report.filteron = false
Forms!Form10!subReport.requery