Charles Byrne
Charles Byrne

Reputation: 834

Access 2007 ReportEvents class is not firing events

I'm having an issue with report events that I haven't encountered before in Access prior to Access 2007.

I'm using using Access 2007 for a Front-end to a SQL Back-end.
I have a Class, ReportEvents, that I use for the reports. In a report's Report_Open event I instantiate and then use this class to handle events like activate, Close, NoData and I also put common code such as exporting data to excel instead of a report.

This code was working fine in a previous Access 2003 application (mdb) I was using, but it isn't working as expected in 2007 (accdb). In my tests the call to a non event public sub, ProvideXLOption works like a charm, but none of the events are being fired from the ReportEvents class. I didn't change the code I just imported it into the project. I set up break points but they aren't being hit. I changed all of them to public events and then called them within the test reports event and they worked fine.

I set up another report in Access 2007 with the same results. I've checked the startup settings in Access and they are fine. I even removed and re-added the database location from the trusted locations without any luck.

Has Microsoft modified the Events Code or is this just a simple code error on my part that I'm not seeing? It's gotta be something simple. My brain is just toast (my son decided to stay awake after last night's feeding).

Class ReportEvents Code:

Option Compare Database
Option Explicit

Private WithEvents rpt As Access.Report
Const strEventKey As String = "[Event Procedure]"

Public Property Set Report(Rept As Access.Report)

    Set rpt = Rept
    With rpt
        .OnActivate = strEventKey        
        .OnClose = strEventKey
        If LenB(.OnNoData) = 0 Then
            .OnNoData = strEventKey
        End If
    End With
End Property

Public Sub Terminate()
    On Error Resume Next
    Set rpt = Nothing
End Sub

Private Sub rpt_Activate()
    LoadPrintRibbon
End Sub

Private Sub rpt_Close()
    Me.Terminate
End Sub

Private Sub rpt_NoData(Cancel As Integer)
    Dim strMsg  As String
    strMsg = "No Records were found that match your criteria."
    MsgBox strMsg, vbInformation, rpt.Name & _
         ": No Match. Report Cancelled"
    Cancel = True
End Sub

Private Sub LoadPrintRibbon()
 #If AccessVersion >= 12 Then
    If rpt.RibbonName <> "PrintPreview" Then
       rpt.RibbonName = "PrintPreview"
    End If
 #End If
End Sub

';;Provides user with option to send data to Excel instead of a report
Public Sub ProvideXLOption(Cancel As Integer)
 '... some XLOption Code
End Sub

In the Test Report Code:

Private Sub Report_Open(Cancel As Integer)
    Dim rptEvts   As ReportEvents
    Set rptEvts = New ReportEvents
    Set rptEvts.Report = Me 

    ';;Let User User Choose to Export Data to Excel or Display the report
    rptEvts.ProvideXLOption Cancel
End Sub

Upvotes: 1

Views: 703

Answers (1)

Charles Byrne
Charles Byrne

Reputation: 834

I figured it out. It was a scope issue The ReportEvents class variable rptEvts, was inside the Report_Open sub. Because of this it wouldn't exist when the other events happened. It should be at the module level and not within the procedure.

Dim rptEvts   As ReportEvents
Private Sub Report_Open(Cancel As Integer)     
   Set rptEvts = New ReportEvents     
   Set rptEvts.Report = Me       
   ';;Let User User Choose to Export Data to Excel or Display the report
   rptEvts.ProvideXLOption Cancel End Sub
End Sub

It's amazing what a little rest will do for you.

Upvotes: 2

Related Questions