我的问题是将焦点设置在打开的特定报表实例上。我复制一个功能,它完美适用于表单对象,但不适用于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 例程中,以下命令会生成错误消息
感谢您的帮助
答案 0 :(得分:1)
解决方案
一般部分模块:
Public Declare Function BringWindowToTop Lib "user32" (ByVal hWnd As Long) As Long
在区块代码中:
BringWindowToTop obj.hwnd
答案 1 :(得分:0)
我不确定为什么这适用于表格,但我看到了两个可能的原因,为什么这不起作用。
您将obj声明为Object。这是一种通用数据类型,在实例化之前没有任何属性(Set obj = New Report)。如果您使用bang(!)obj.txtdate / obj!visible / obj!Setfocus通过后期绑定引用它可能会有效。
还需要为object.visible分配一个值(True / False)。除非你正在处理多种类型的对象,否则我会将obj obj作为Access.Report。
答案 2 :(得分:0)
我想我想通了,clsReport不是一个集合,它是一个Dictionary对象。当你设置oReport = Nothing时,你将它从范围中取出,因为字典没有保留对象的副本,只是对它的引用。
集合存储一个完整的副本,这就是为什么在存储复杂对象时字典速度更快,更少膨胀。
同样,为什么它适用于我不知道的表格,你可能没有像报道一样复制表格。
如果你不确定在'Créationdunouveau formulaire
之前加上这一行Msgbox Typename(clsReport)
如果它说Dictionary有你的答案,当你破坏对象(oReport)时,Dictionary中的引用指向什么。它不会删除Dictionary项,这就是为什么在For Each循环中引用集合(字典)项时没有出现错误的原因,只有当您尝试访问不再存在的对象属性时才会出现错误。
将相同的Msgbox行放在obj.Visible
之上Msgbox TypeName(obj)
它应该回来“空”。