Access 2007 ReportEvents类未触发事件

时间:2011-08-08 16:09:11

标签: ms-access vba ms-access-2007 access-vba

我遇到了报告事件的问题,我没有 在Access 2007之前的Access中遇到过。

我正在使用Access 2007作为SQL后端的前端 我有一个类,ReportEvents,我用于报告。 在报表的Report_Open事件中,我实例化然后使用此类 处理诸如activate,Close,NoData之类的事件,我也放了常用代码 例如将数据导出到Excel而不是报告。

此代码在我以前使用的Access 2003应用程序(mdb)中运行正常, 但它在2007年没有按预期工作(accdb)。在我的测试中,调用非事件公共子,ProvideXLOption就像一个魅力,但没有一个事件被触发 来自ReportEvents类。我没有更改我刚刚导入它的代码 项目。我设置了断点,但他们没有被击中。我改变了所有这些 公共事件然后在测试报告事件中调用它们并且它们工作正常。

我在Access 2007中设置了另一个报告,结果相同。我查过了 Access中的启动设置,它们很好。我甚至删除并重新添加 来自受信任位置的数据库位置没有任何运气。

微软是否修改了事件代码,或者这只是我看不到的一个简单的代码错误?它必须是简单的东西。我的大脑只是吐司(我的儿子决定在昨晚的喂食后保持清醒)。

类ReportEvents代码:

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

在测试报告代码中:

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

1 个答案:

答案 0 :(得分:2)

我明白了。这是一个范围问题ReportEvents类变量rptEvts位于Report_Open子中。因此,当其他事件发生时它就不存在。它应该在模块级别而不是在过程中。

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

让你休息一下真是太棒了。