I was hoping for a single for loop with an ordered by clause, but my local developers say that I need to upgrade to C for that kind of feature. But I did come up with a solution almost exactly as Rokslide suggested. Basically, I built an array placing each report name (same as the checkbox name) in the position of the TabIndex. Then I can walk through the array and print the reports in order, much to my client's delight. Here is my solution: (p.s. my formatting is better than shown

)
Dim ctl As Control
Dim chk As CheckBox
Dim iControlIndex As Integer
Dim strTag(100) As String
Dim strReportName(100) As String
Dim rptReport As Report
'Build an array of checkbox/report names in the order of the checkbox's tab index
iControlIndex = 0
For Each ctl In Me.Controls
iControlIndex = iControlIndex + 1
If TypeOf ctl Is CheckBox Then
Set chk = ctl
If chk.Value = True Then
strReportName(chk.TabIndex) = ctl.Name
strTag(chk.TabIndex) = chk.Tag
End If
End If
Next
'Print reports in check box tab index order using the array set above
For idx = 0 To iControlIndex
If strReportName(idx) > "" Then
DoCmd.OpenReport strReportName(idx), AcView.acViewPreview, , strTag(idx) & " between " & Me.Begin_District & " and " & Me.End_District, acHidden
Set rptReport = Reports(strReportName(idx))
If rptReport.Printer.Orientation = acPRORLandscape Then
rptReport.Printer.Duplex = acPRDPVertical
Else
rptReport.Printer.Duplex = acPRDPHorizontal
End If
DoCmd.SelectObject acReport, strReportName(idx), False
DoCmd.PrintOut acPrintAll
DoCmd.Close acReport, strReportName(idx), acSaveNo
End If
Next