在 Access 2007 中,是不是可以遍历自定义类别中的项目?

Posted

技术标签:

【中文标题】在 Access 2007 中,是不是可以遍历自定义类别中的项目?【英文标题】:In Access 2007, is it possible to loop though items in a custom category?在 Access 2007 中,是否可以遍历自定义类别中的项目? 【发布时间】:2013-04-12 14:09:56 【问题描述】:

在 Access 2007 的导航窗格中,我们有“自定义”类别,可以创建自定义类别、为其命名、添加表格、查询等。VBA 是否可以循环遍历一个自定义类别?

例如,我创建了一个名为“Validations”的类别,它包含 5 个查询。我想遍历每个查询并运行它。在伪代码中,它看起来像这样:

For Each Query in Validations
    DoCmd.OpenQuery "Query"

编辑:我开始研究它,看起来我需要访问 MSysNavPaneGroups 表来获取我的自定义组的 ID。在我的例子中,ID = 235

此外,是否可以在此过程中创建 Excel 电子表格,如果查询返回 >0 行,是否将行粘贴到 Sheet1、Sheet2 等?比如:

Count = 1

For Each Query in Validations
    DoCmd.OpenQuery "Query"
    If Query.Rows > 0
        Excel.Sheet(i).Name = Query.Name
        Excel.Sheet(i).Rows = Query.Rows
        Count = Count + 1
    End If

我自己还没有开始研究 Excel 部分,所以如果你不想弄乱它也没关系。我更关心遍历自定义类别中的查询。

一如既往,谢谢!

编辑:我在下面使用 Gord 的 SQL 创建了一个名为“GetValidationNames”的查询:

SELECT MSysNavPaneGroups.Name AS GroupName, MSysNavPaneGroupToObjects.Name AS ObjectName
FROM MSysNavPaneGroups INNER JOIN MSysNavPaneGroupToObjects 
    ON MSysNavPaneGroups.Id = MSysNavPaneGroupToObjects.GroupID
WHERE (((MSysNavPaneGroups.GroupCategoryID)=3))
ORDER BY MSysNavPaneGroups.Name, MSysNavPaneGroupToObjects.Name;

然后创建了一个带有按钮的表单,并在 Button_Click() 中添加了以下内容:

Dim rs as Recordset
Set rs = CurrentDb.OpenRecordset("GetValidationNames")

Do While Not rs.EOF
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, rs("ObjectName"), _
        "C:\users\username\Desktop\ValidationResults.xlsx"
    rs.MoveNext
Loop

这会运行所有查询,并将每个查询作为新选项卡添加到现有 Excel 文件“ValidationResults.xlsx”中

【问题讨论】:

检查MSysNavPane* 系统表。它们保存有关组的信息以及与它们关联的数据库对象。我不知道检索所需信息的正确方法,但......我在对象模型中看不到任何方法。 @HansUp 谢谢 .. 我知道我可以从 MSysNavPaneGroups 获取组 ID,从 MSysNavPaneGroupToObjects 获取查询 ID 是的,您可能可以创建一个新查询来返回属于自定义组成员的查询的名称。但是,我对依赖查询系统表犹豫不决。当我看到有人使用 Access 2007 在MSysObjects 上遇到“无读取权限” 的报告时,我被关闭了。我不知道您在尝试读取MSysNavPane* 表时是否会遇到类似问题。 @HansUp 我在 Access 内部使用 [MSys*] 表没有遇到任何问题,尽管如果您连接到 . mdb/.accdb 文件通过 OLEDB。 杰夫,我并不感到惊讶。可能是我过于谨慎了。我认为您应该接受 Gord 的回答并将“导出到 Excel”部分分解为一个单独的问题。何时/如果您这样做,请告诉我们您是否希望将这些查询导出到单独的工作簿或作为一个工作簿中的单独工作表。 【参考方案1】:

我只是做了这个,所以我没有对其进行任何严格的测试,但它似乎列出了分配给自定义类别的所有对象

SELECT MSysNavPaneGroups.Name AS GroupName, MSysNavPaneGroupToObjects.Name AS ObjectName
FROM MSysNavPaneGroups INNER JOIN MSysNavPaneGroupToObjects 
    ON MSysNavPaneGroups.Id = MSysNavPaneGroupToObjects.GroupID
WHERE (((MSysNavPaneGroups.GroupCategoryID)=3))
ORDER BY MSysNavPaneGroups.Name, MSysNavPaneGroupToObjects.Name;

如果一个类别包含不止一种类型的对象(例如,表和查询),它可能会扩展为返回对象类型。

【讨论】:

谢谢 .. 这确实可以返回特定自定义组中的查询(对象)列表 :) @JeffBrady 不客气。回复:Excel 部分——如果您不想直接使用 Excel 自动化,您可以将计数存储在 Access 表中,并在完成后使用 docmd.TransferSpreadsheet acExport,... 将其导出到 Excel。 是的,这可能更有意义。谢谢! 非常有用,谢谢!我有 200 多个自定义组,尽管有搜索功能,但很难找到特定对象在哪个组中 - 特别是如果它在错误的组中:) 在添加表 MSysNavPaneObjectIDs 和它的字段“名称”之后,查询现在变得很容易'。干杯!

以上是关于在 Access 2007 中,是不是可以遍历自定义类别中的项目?的主要内容,如果未能解决你的问题,请参考以下文章

同时运行 Access 2003 和 2007 是不是安全?

Access 2007 文本框被视为空,而实际上不是

确定是不是在 MS Access 2007 列表框中选择了行

升级到 Access 2007,信任中心问题

在 microsoft access (2007) 中启用关系数据库值的视图

输入 access 2007 表单时如何更新另一个文本框?