在报表中显示多个特定记录

Display multiple specific records in a report

假设我有一个名为 "Customers" 的 table。它包含 2 个字段:

Name
Address

我希望用户能够通过 select 输入他们的名字来 select 多条记录。例如,有一个包含数据库中所有记录名称的列表框。我希望用户能够 select 多个项目,例如:

Dave Richardson
Bob Smith
Sophie Parker

然后在报表中只显示这些名称的记录。

我的设置是,一个带有子窗体和一个列表框的窗体,列表框将包含所有客户的名称。所以 RowSource 将是,

SELECT 
    customerNameFieldName
FROM
    yourTableName;

Multi Select 属性 将设置为 Extended。然后一个按钮将具有以下代码,该代码将为子窗体的记录源生成 SQL。

Private Sub buttonName_Click()
    Dim lItem As Varaint, strSQL As String
    Dim custNames As String, whereStr As String
    Dim dbObj As dao.Database
    Dim tmpQryDef As QueryDef

    Set dbObj = CurrentDb()

    For Each lItem In Me.yourListBoxName.ItemsSelected
        custNames = custNames & "'" & Me.yourListBoxName.ItemData(lItem) & "', "
    Next

    Id Len(custNames) <> 0 Then
        custNames = Left(custNames, Len(custNames) - 2)

        whereStr = "WHERE customerNameFieldName IN (" & custNames & ")"
    End If

    strSQL = "SELECT someFields FROM someTable " & whereStr

    Set tmpQryDef = dbObj.QueryDefs("Summary 3 Q1")
    tmpQryDef.SQL = strSQL

    DoCmd.OpenReport "yourReportName", acViewNormal

    Set dbObj = Nothing
    Set tmpQryDef = Nothing 
End Sub

现在 SubForm 将具有基于您在 ListBox 中选择的所有信息的 RecordSource。

您可以使用 DoCmd.OpenReport MethodWhereCondition 选项根据需要过滤报告。

Const cstrReport As String = "YourReportNameHere"
Dim custNames As String
Dim lItem As Variant
Dim strWhereCondition As String

With Me.yourListBoxName
    For Each lItem In .ItemsSelected
        custNames = custNames & ",'" & Replace(.ItemData(lItem), "'", "''") & "'"
    Next
End With

If Len(custNames) > 0 Then
    custNames = Mid(custNames, 2)
    strWhereCondition = "[Name] IN (" & custNames & ")"
End If

DoCmd.OpenReport ReportName:=cstrReport, View:=acViewPreview, _
    WhereCondition:=strWhereCondition

请注意,此方法与 PaulFrancis 的答案有共同之处。事实上,我复制了他的代码并进行了修改。主要区别在于此方法不需要您修改已保存的查询来过滤报告。