Create A Filtered Recordset From An Open Recordset
Sometimes it is useful to use the same recordset in a module but dynamically filter it based on a multi-select list box. Filtering a recordset based on a multi-select list box can be done in a number of ways:
(1) Set the filter property in a form or report
(2) Open the recordset with a SQL statement that includes a WHERE clause
(3) Include a function that returns a SINGLE value in the "Criteria" section of the graphic query builder
(4)
Build a table of filtering criteria and use the table in an Inner JOIN
(5) Open a secondary recordset based on the primary recordset using the recordset.filter property
This example illustrates option 5.
Program Code
Option Compare Database Option Explicit ' *********************************************************************** ' Create A Filtered Recordset FROM An Open Recordset ' *********************************************************************** Public Function TestFilter() Dim db As Database Dim recIn As Recordset Dim recFiltered As Recordset Dim intRecCount As Integer intRecCount = 0 ' *********************************************************************** ' Open The Primary Recordset ' *********************************************************************** Set db = CurrentDb() Set recIn = db.OpenRecordset("qryProducts") If recIn.EOF Then MsgBox ("No Input Records") recIn.Close Set recIn = Nothing Set db = Nothing Exit Function End If recIn.MoveLast recIn.MoveFirst MsgBox ("Primary Record Count = " & recIn.RecordCount) ' *********************************************************************** ' Set A Filter For The Primary Recordset ' *********************************************************************** recIn.Filter = "[Category 1] IN('AA','CP')" ' *********************************************************************** ' Open A Second Recordset By Filtering the First Recordset ' *********************************************************************** Set recFiltered = recIn.OpenRecordset recFiltered.MoveLast recFiltered.MoveFirst MsgBox ("Filtered Record Count = " & recFiltered.RecordCount) ' *********************************************************************** ' Loop Through and Print Up To 5 Records ' *********************************************************************** Do Debug.Print recFiltered![Category 1] intRecCount = intRecCount + 1 recFiltered.MoveNext Loop Until recFiltered.EOF Or intRecCount = 5 recFiltered.Close recIn.Close Set recFiltered = Nothing Set recIn = Nothing Set db = Nothing End Function