Vba 关闭集合中的最后一个报表

Vba 关闭集合中的最后一个报表,vba,ms-access,ms-access-2016,Vba,Ms Access,Ms Access 2016,我创建了一个集合,其中存储了使用不同过滤器打开的报表的多个实例 如果我尝试关闭最近打开的报表,它将从集合中删除,但不会关闭 所有其他报告都将从集合中删除并关闭 如何关闭上一份报告 Private Sub CloseButton\u Click() 作为整数的Dim i 新的收藏 设置rptcol=ReportCollectionModule.rptCollection 对于i=1到rptcol.计数 如果Me.Hwnd=rptcol.Item(i).Hwnd,则 退出 如果结束 下一个 文档关闭

我创建了一个集合,其中存储了使用不同过滤器打开的报表的多个实例

如果我尝试关闭最近打开的报表,它将从集合中删除,但不会关闭

所有其他报告都将从集合中删除并关闭

如何关闭上一份报告

Private Sub CloseButton\u Click()
作为整数的Dim i
新的收藏
设置rptcol=ReportCollectionModule.rptCollection
对于i=1到rptcol.计数
如果Me.Hwnd=rptcol.Item(i).Hwnd,则
退出
如果结束
下一个
文档关闭acReport,rptcol.项目(i).说明,acSaveNo
rptcol.Remove i
设置ReportCollectionModule.rptCollection=rptcol
端接头
ReportCollectionModule是一个基本的setter和getter

选项比较数据库
作为新收藏的私人收藏
公共属性获取rptCollection()作为集合
设置rptCollection=myRptCollection
端属性
公共属性集集合(此集合作为集合)
设置myRptCollection=thiscolection
端属性
报告将添加到集合中,如下所示:

Private Sub-ID\u Click()
Dim rpt作为报告
新的收藏
设置rptcol=ReportCollectionModule.rptCollection
设置rpt=新报告\u ProductTable
rpt.RecordSource=“产品表”
rpt.Filter=“[ID]=”&Me![ID]
rpt.Visible=True
rpt.Caption=DLookup(“[ProductName]”、“产品表”、“[ID]=”&Me![ID]”)
摘录:再查询
rptcol.添加rpt,CStr(rpt.Hwnd)
设置ReportCollectionModule.rptCollection=rptcol
Product_Name.SetFocus
ID.Visible=False
端接头

DoCmd.Close acReport,rptcol.Item(i).Caption,acSaveNo
可能无法按您的预期工作,因为
DoCmd.Close对象,objectName
将按其名称而不是按其标题/标题关闭对象

如果使用docmd.close object,object Name,通过报表的
名称关闭报表,则Access在内存中找到的第一个实例将关闭,直到不再关闭为止

ReportCollectionModule.rptCollection.Remove report.Hwnd
应关闭指定的实例。请发布您是如何管理/添加表单的,您可能有一个缺陷


不要使用类,而是将
rptCollection
作为公共对象/字典,只使用
rptCollection.remove hwnd
这就是我正在使用的。它关闭所有表单,但从中调用的表单除外:

Private Sub CloseAllForms()
    Dim lngLoop As Long
    On Error Resume Next
    For lngLoop = (Forms.Count - 1) To 1 Step -1
        If Me.Name <> Forms(lngLoop).Name Then
            DoCmd.Close acForm, Forms(lngLoop).Name
        End If
    Next lngLoop
End Sub
Private Sub CloseAllForms()
昏暗的夜总会
出错时继续下一步
对于lngLoop=(Forms.Count-1)到1步骤-1
如果我是。姓名表(lngLoop)。那么姓名
DoCmd.Close acForm,Forms(lngLoop).Name
如果结束
下一个lngLoop
端接头
您可以对报告执行相同的操作:

Private Sub CloseAllReports()
    Dim lngLoop As Long
    On Error Resume Next
    For lngLoop = (Reports.Count - 1) To 1 Step -1
        If Me.Name <> Reports(lngLoop).Name Then
            DoCmd.Close acReport, Reports(lngLoop).Name
        End If
    Next lngLoop
End Sub
Private Sub CloseAllReports()
昏暗的夜总会
出错时继续下一步
对于lngLoop=(Reports.Count-1)到1步骤-1
如果我.Name报告(lngLoop).Name然后
DoCmd.关闭acReport,报告(lngLoop).Name
如果结束
下一个lngLoop
端接头

我用向集合中添加表单的代码更新了我的原始帖子。如果我将集合转换为字典,我将如何在模块中启动它?我相信您必须使用以下命令:
Dim MyDict作为新脚本。Dictionary
Set MyDict=New Scripting。Dictionary
但我不能像使用集合那样在子对象之外创建该对象。@grandioquence最理想的做法是公开以报表对象为参数并添加到全局字典的函数。在helper函数中,您可以检查是否需要初始化全局字典变量。重点是您需要有一个公共静态/单例集合对象。