2013-04-12 63 views
2

在Access 2007的导航窗格中,我们有“自定义”类别,可以创建一个自定义类别,将其命名,并添加表格,查询等。是否可以使用VBA循环自定义所有项目类别?在Access 2007中,是否可以循环自定义类别中的项目?

例如,我创建了一个名为“验证”类别,它包含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部分,所以没关系,如果你不想惹它。我更关心循环查看自定义类别中的查询。

一如既往,谢谢!

编辑:我创建使用下面戈德的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”

+0

检查'MSysNavPane *'系统表。他们掌握有关组的信息以及哪些数据库对象与它们相关联。我不知道检索所需信息的正确方法,但是...我在对象模型中没有看到任何方法。 – HansUp

+0

@HansUp谢谢你..我看我可以从MSysNavPaneGroups和查询的ID从MSysNavPaneGroupToObjects获得组ID –

+0

呀,你也许可以创造一个新的查询要返回的是自定义组的成员查询的名称。但是,我不愿意依赖查询系统表。当我在Access 2007中看到有人在MSysObjects上遇到*“没有读取权限”的报告时,我关闭了。我不知道您是否可能遇到类似的问题,试图读取“MSysNavPane *”表。 – HansUp

回答

2

我只是熟了这个,所以我没有给它任何rigoro我们的测试,但它似乎列出所有分配到自定义类别

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; 

它可能会扩展到返回的对象类型,如果一个类中包含多种类型的对象(如表和查询)的对象。

+0

谢谢..这没有工作来返回特定自定义组中的查询(对象)列表:) –

+0

@JeffBrady不客气。 re:Excel部分 - 如果你不想直接混淆Excel自动化,你可以将你的计数存储在一个Access表中并使用'docmd.TransferSpreadsheet acExport,...'在完成后将它导出到Excel 。 –

+0

是的,这可能更有意义。谢谢! –

相关问题