MS Access 如何将焦点集中在特定的多个报表实例上

Posted

技术标签:

【中文标题】MS Access 如何将焦点集中在特定的多个报表实例上【英文标题】:MS Access how set focus on a particular multiple report instance 【发布时间】:2016-06-03 11:35:16 【问题描述】:

我的问题是将焦点设置在打开的特定 Report 实例上。我复制了一个非常适用于表单对象但不适用于报表对象的函数。我的功能:

Function mInstanceReportCA(varYear As Variant)

Dim oReport As Access.Report
Dim obj As Object

' Création du nouveau formulaire
For Each obj In clsReport
    If obj.txtYear = varYear Then
        obj.Visible 'Error 438 
        obj.SetFocus 'Error 2465
        Exit Function
    End If
Next obj

Set oReport = New Report_rptCaMois

' Activation du nouveau formulaire
With oReport

    If varYear = "1999" Then
        .txtYear = "1999"
        .Caption = "Rapport toutes années confondues"
        .Filter = "Year(dateFacture) > 1999 "
    Else
        .txtYear = CStr(varYear)
        .Caption = "Rapport pour l'année  " & CStr(varYear)
        .Filter = "Year(dateFacture) = " & varYear
    End If
    .FilterOn = True
    .Visible = True
End With


' Ajout du formulaire à la collection globale
clsReport.Add Item:=oReport, Key:=CStr(oReport.Hwnd)

Set oReport = Nothing
end function

For Each obj In clsReport 例程中,以下命令会生成错误消息

    obj.Visible:错误 438 obj.SetFocus:错误 2465

感谢您的帮助

【问题讨论】:

什么是 clsReport?似乎不是 report.objects 数组 clsReport 是一个集合对象 检查debug.print TypeName(obj)是否是报告对象。 报表无法获得焦点,只有它的控件。如果你想把它放在前面,你可以使用DoCmd.SelectObject acReport, obj.name 【参考方案1】:

解决办法

一般部分模块:

Public Declare Function BringWindowToTop Lib "user32" (ByVal hWnd As Long) As Long

在代码块中:

BringWindowToTop obj.hwnd

感谢Dirk Goldgar

【讨论】:

【参考方案2】:

我不确定为什么这适用于表单,但我看到了 2 个可能的原因导致这不起作用。

您将 obj 声明为 Object。这是一种在实例化之前没有任何属性的通用数据类型(Set obj = New Report)。如果您通过后期绑定使用 bang (!) obj.txtdate / obj!visible / obj!Setfocus 引用它可能会起作用。

还需要为 object.visible 分配一个值(真/假)。除非您要处理多种类型的对象,否则我会将 obj 调暗为 Access.Report。

【讨论】:

你是对的 object.visible,它需要分配真/假值。我更正了我的代码,现在没有更多错误消息了。但是对于obj.setFocus,还是报错“Run-time error 2465 - Application-defined or Object-defined error”【参考方案3】:

我想我明白了,clsReport 不是一个集合,它是一个 Dictionary 对象。当您设置 oReport = Nothing 时,您将其超出范围,因为字典不保留对象的副本,仅保留对它的引用。

集合存储了一个完整的副本,这就是为什么字典在存储复杂对象时速度更快且不那么臃肿的原因。

同样,我不知道为什么它适用于表单,您可能没有像制作报告那样复制表单。

如果您不确定将这一行放在 ' Création du nouveau formulaire 之前

Msgbox Typename(clsReport)

如果它说字典有你的答案,当你销毁对象(oReport)时,字典中的引用指向任何东西。它不会删除 Dictionary 项目,这就是为什么当您在 For Each 循环中引用 collection(dictionary) 项目时不会出现错误的原因,只有当您尝试访问不再存在的对象属性时。

把同样的 Msgbox 行放在 obj.Visible 上面

Msgbox TypeName(obj)

它应该返回“空”。

【讨论】:

在 VBA 编辑器间谍窗口中,我检查了 obj 是否已很好地实例化。没问题。另一个证明,测试 'If obj.txtYear = varYear Then' 完美运行 我认为我们需要查看更多代码。你能发布实际的表单代码和集合声明吗?

以上是关于MS Access 如何将焦点集中在特定的多个报表实例上的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010:根据特定组合框条件过滤字段中包含多个值的报表

基于另一个子报表的 MS Access 子报表过滤器

MS Access:如何过滤非报告字段的报告?

如何在 MS Access 中隐藏空子报表上的按钮?

MS Access:将参数传递给不带 SQL 的子报表

MS Access - 在设计时添加未绑定字段