Provided by Allen Browne. Created: 1995. Last updated: August 2008.
Limiting a Report to a Date Range
Here are two methods to limit the records in a report to a user-specified range of dates.
For a more comprehensive example that combines other criteria with the dates, see Search Criteria database.
Method 1: Parameter query
The simplest approach is to base the report on a parameter query. This approach works for all kinds of queries, but has these disadvantages:
- Inflexible: both dates must be entered.
- Inferior interface: two separate dialog boxes pop up
- No way to supply defaults.
- No way to validate the dates.
To create the parameter query:
- Create a query to use as the RecordSource of your report.
- In query design view, in the Criteria row under your date field, enter:
>= [StartDate] < [EndDate] + 1
- Choose Parameters from the Query menu, and declare two parameters of type Date/Time:
StartDate Date/Time
EndDate Date/Time
- To display the limiting dates on the report, open your report in Design View, and add two text boxes to the Report Header section. Set their ControlSource property to =StartDate and =EndDate respectively.
(Note: Step 3 is optional, but strongly recommended. It prevents invalid dates being entered, and helps Access understand the date regardless of your regional setting date format.)
Method 2: Form for entering the dates
The alternative is to use a small unbound form where the user can enter the limiting dates. This approach may not work if the query aggregates data, but has these advantages:
- Flexible: user does not have to limit report to from and to dates.
- Better interface: allows defaults and other mechanisms for choosing dates.
- Validation: can verify the date entries.
Here are the steps. This example assumes a report named rptSales, limited by values in the SaleDate field.
- Create a new form that is not bound to any query or table. Save with the name frmWhatDates.
- Add two text boxes, and name them txtStartDate and txtEndDate. Set their Format property to Short Date, so only date entries will be accepted.
- Add a command button, and set its Name property to cmdPreview.
- Set the button's On Click property to [Event Procedure], and click the Build button (...) beside this. Access opens the code window.
- Between the "Private Sub..." and "End Sub" lines paste in the code below.
Private Sub cmdPreview_Click()
Dim strReport As String
Dim strDateField As String
Dim strWhere As String
Dim lngView As Long
Const strcJetDate = "\#mm\/dd\/yyyy\#"
strReport = "rptSales"
strDateField = "[SaleDate]"
lngView = acViewPreview
If IsDate(Me.txtStartDate) Then
strWhere = "(" & strDateField & " >= " & Format(Me.txtStartDate, strcJetDate) & ")"
End If
If IsDate(Me.txtEndDate) Then
If strWhere <> vbNullString Then
strWhere = strWhere & " AND "
End If
strWhere = strWhere & "(" & strDateField & " < " & Format(Me.txtEndDate + 1, strcJetDate) & ")"
End If
If CurrentProject.AllReports(strReport).IsLoaded Then
DoCmd.Close acReport, strReport
End If
DoCmd.OpenReport strReport, lngView, , strWhere
Exit_Handler:
Exit Sub
Err_Handler:
If Err.Number <> 2501 Then
MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "Cannot open report"
End If
Resume Exit_Handler
End Sub
- Open the report in Design View, and add two text boxes to the report header for displaying the date range. Set the ControlSource for these text boxes to:
=Forms.frmWhatDates.txtStartDate
=Forms.frmWhatDates.txtEndDate
Now when you click the Ok button, the filtering works like this:
- both start and end dates found: filtered between those dates;
- only a start date found: records from that date onwards;
- only an end date found: records up to that date only;
- neither start nor end date found: all records included.
You will end up using this form for all sorts of reports. You may add an option group or list box that selects which report you want printed, and a check box that determines whether the report should be opened in preview mode.