VBA 列出 MS Access 中所有打开的对象

Posted

技术标签:

【中文标题】VBA 列出 MS Access 中所有打开的对象【英文标题】:VBA to list all open objects in MS Access 【发布时间】:2019-03-25 14:55:16 【问题描述】:

我想知道 Access VBA 是否可以列出当前 Access 实例中所有打开的文档选项卡。我有可以检查每个 Access 对象并报告它是否已加载的代码。它很快,但感觉像是一种倒退的方法。它也无法列出未保存的对象,例如新查询。此外,我无法分辨哪些对象正在显示选项卡。弹出窗口没有选项卡。

是否有可以列出所有选项卡式文档的 VBA 例程?

Public Sub ListAllOpenObjects()
' This will list all open Access objects.  It will not list
' objects that are new that have not be saved, like Query1.

    Dim aob As AccessObject

    With CurrentData
        ' "Tables"
        For Each aob In .AllTables
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

        ' "Queries"
        For Each aob In .AllQueries
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob
    End With

    With CurrentProject
        ' "Forms"
        For Each aob In .AllForms
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

        ' "Reports"
        For Each aob In .AllReports
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

        ' "Pages"
        For Each aob In .AllDataAccessPages
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

        ' "Macros"
        For Each aob In .AllMacros
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

        ' "Modules"
        For Each aob In .AllModules
            If aob.IsLoaded Then
                Debug.Print aob.name
            End If
        Next aob

    End With

End Sub

【问题讨论】:

【参考方案1】:

表单和报告有一个快捷方式,Application.Forms 包含所有打开的表单,Application.Reports 包含打开的报告(无论它们是弹出窗口还是不可见)。

由于用户不应该能够打开表或查询,这在生产中就足够了。

如果您在开发过程中需要该信息,则必须循环相应的集合并检查每个 forIsLoaded

作为替代方案,您应该能够通过句柄检测打开的选项卡,但这需要大量使用(和知识)WinAPI 函数,如FindWindowGetClassName。这可以用来提高您的 WinAPI 技能,但并不比循环集合更优雅。

【讨论】:

我构建了一个开发者插件,我想要一种方法来跟踪所有打开的选项卡。这是对this 的增强。如果没有 WinAPI,似乎没有办法做我想做的事(列出未保存对象的选项卡)。 Application.SysCmd 提供新的对象状态,也许是一个选项? 添加信息和链接到问题的加载项!也在***.com/questions/57103395/…! 我不介意共享我的加载项,但我没有托管它们的网站。如果您希望我 PM 您,请将您的联系信息放在您的个人资料中。 我的评论应该让您将 cmets 信息添加到问题中。与***.com/questions/57103395/… 相同。当然,总是欢迎分享代码(创建一个 github 要点?),但我在 2 周前找到了你的数据库,当时解释了这个问题 here(德语)。

以上是关于VBA 列出 MS Access 中所有打开的对象的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA从Web浏览器控件的内容中获取数据

从 VBA 代码中转储 MS Access 宏对象信息

专家 - 表单打开方式不同于设计视图与 MS Access 对象列表

在 MS Access/VBA 中使用 ADO 连接对话框

MS ACCESS---全部通过VBA刷新

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码