I've been meaning to write an article about this one since Karl Donaubauer presented it to the Access Europe User Group back on January 4, 2023.
This was just one of Karl's many tips and tricks that he presented. If you want to watch the video, this section starts at the 28:54 mark:
Karl's code relies on the Report Header's Print event handler being called.
That can only happen on reports that have a Report Header. The report header section does not need to be visible; it can have a height of 0. It does need to be there, though.
Here's Karl's code as shown in the video:
Option Compare Database Option Explicit 'Author: Karl Donaubauer 'Source: https://www.youtube.com/watch?v=k9jgkzG2IaU&t=1554s 'determines if the report is sent to the printer, ' as opposed to being opened in any screen view Dim blnPreview As Boolean Private Sub Report_Activate() 'Activate only happens for screen views If Me.CurrentView = acCurViewPreview Then blnPreview = True ElseIf Me.CurrentView = acCurViewReportBrowse Then Debug.Print "Screen (aka, Report View)" End If End Sub Private Sub ReportHeader_Print(Cancel As Integer, PrintCount As Integer) 'Print happens at page preview or print If blnPreview Then Debug.Print "Print Preview" Else Debug.Print "Sent to Printer" End If blnPreview = Not blnPreview End Sub
During the live event, Access MVP and host Colin Riddington asked whether Karl's code could distinguish reports in Layout Mode. Karl wasn't sure when put on the spot, but he followed up with responses in the comments of the video. Here's his final response to that question:
Colin asked if you can also detect the Layout view. Answer: only very limited. When I additionally query the corresponding constant acCurViewLayout in the Activate event, the Report view is usually reported, i.e. Layout is not recognized. Only if I open the report from the navigation pane, Activate is done twice: once with Report view feedback, once with Layout view. But, as noted in the meeting, I think this is a largely academic question, because the Layout view will hardly ever be made available to the end user.
Indeed, Layout Mode is most useful when sizing controls at design time. I would never show a report in Layout Mode to an end user.
One important thing to keep in mind: just because the user sent a report to the printer, there's no guarantee it actually printed.
Sending a document to a printer is one of the leakiest abstractions in software. There are so many things that can go wrong:
- The paper could jam
- The printer could be out of toner
- Wrong size paper loaded
- Wrong color paper loaded
- Wrong type of paper loaded (e.g., plain vs. perforated vs. labels, etc.)
- It's a virtual printer (e.g., PDFCreator)
The bottom line is that there is no way to guarantee that any report has been successfully printed without explicitly asking the user.
In situations where it's important (e.g., printing on preprinted check stock), I'll often ask the user in the
Report_Close event, something along the lines of "Did the report/checks/labels/letters/etc. print correctly?"
Unfortunately, users have been known to make mistakes occasionally, too. (I swear! I've seen it happen.) So be sure you've thought about how you would undo whatever process(es) need(s) to be undone if they accidentally choose the wrong answer to that question.