使用VBA在MS Excel中列出MS Access表的子集

我在MS Access 2002数据库中有一系列以“RP_”开头的商店查询/表格。 我想在MS Excel 2002电子表格的列表框菜单中列出这些表名。 任何想法如何做到这一点?

有很多方法可以做到这一点。
这里是一个:

  • 将ActiveXcombobox控件添加到窗体(比如ComboBox1 ),并将其LinkedCell属性链接到要存储结果的单元格。

  • 将对“Microsoft DAO 3.6对象库”的引用添加到Excel工作簿(ALT-F11打开IDE,然后菜单工具>引用…)。
    这些MDAC组件应该已经安装在所有最新的机器上。
    请注意,如果您使用Office 2007,则最好引用“ Microsoft Office 12.0 Access数据库引擎对象库”,因为它可以让您打开较新的ACCDB Access 2007数据库。

  • 插入一个新的模块到您的工作簿,并把这个代码:

     ' Fill the given combobox with all the tables and query names ' ' starting with RP_ found in the given database. ' Public Sub FillWithAccessEntities(PathToAccessDB As String, combox As ComboBox) Dim db As DAO.Database Dim td As DAO.TableDef Dim qd As DAO.QueryDef combox.Clear ' Open the db in exclusive and read-only mode ' Set db = DBEngine.OpenDatabase(PathToAccessDB, True, True) For Each td In db.TableDefs If Left(td.Name, 3) = "RP_" Then combox.AddItem td.Name End If Next For Each qd In db.QueryDefs If Left(qd.Name, 3) = "RP_" Then combox.AddItem qd.Name End If Next db.Close Set db = Nothing End Sub 
  • 要初始化combobox,我们可以从工作簿的“打开”事件中调用此代码。
    ThisWorkbook模块中插入此代码,假定已将ActiveX组合ComboBox1添加到Sheet1

     Sub Workbook_open() FillWithAccessEntities "c:\mydb.mdb", Sheet1.ComboBox1 End Sub 

现在,当您打开文件时,combobox将自动填充数据库中的表和查询名称。

在打开Access数据库的VBA即时窗口中,执行以下操作:

 ? access.CurrentData.AllQueries.Count 11 ? access.CurrentData.AllQueries.Item(1).Name ATP Underwrites Chinese 

所以在Access中有一个CurrentData的coClass,可以计数和逐项的AllQueries属性。

在Excel中定义对Microsoft Access对象的引用。 然后在VBA模块中粘贴这样的东西:

 Function Queryname(n As Integer) As Variant Dim v As Variant Dim c As Long c = Access.CurrentData.AllQueries.Count v = Access.CurrentData.AllQueries.Item(n).Name Queryname = v End Function 

然后在一张纸上,你应该可以说

 =Queryname(1) 

并获得有用的东西。

顺便说一句,访问将不得不在我应该思考的时候运行。

在Excel中遇到ODBC错误的问题很可能是由数据库本身的权限问题引起的。 默认情况下,pipe理员帐户(这是您可能使用的)不具有对MSysObjects的读取权限。 您可以通过进入用户权限并授予pipe理员帐户对该表的读取访问权限来解决此问题。 这种方法的困难在于权限存储在本地机器上的system.mdw文件中(假设你没有改变这个)。 这意味着您将不得不修复使用您正在创build的代码的每台机器的权限。

但是,您可以使用ADO扩展库躲避整个问题。 下面的代码应该是“Just Run”,假设你给它一个适当的数据库path。

 Option Explicit Public Sub Example() EnumerateDBTables Range("A1:A2"), "C:\Test\db1.mdb" End Sub Public Sub EnumerateDBTables(ByVal target As Excel.Range, ByVal dbPath As _ String, Optional ByVal clearSheet As Boolean = True) 'Requires reference to Microsoft ADO Ext. 2.8 for DDL and Security 'If you have trouble finding it, look here: 'C:\Program Files\Common Files\System\ado\msadox28.tlb Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim ws As Excel.Worksheet Dim lngRow As Long Dim lngCol As Long Set ws = target.Parent If clearSheet Then ws.UsedRange.Clear Set cat = New ADOX.Catalog cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ dbPath 'Add Headers: ws.Range(target.Cells(1, 1), target.Cells(1, 1).Offset(0, 3)) = _ Array("Name", "Type", "Created", "Modified") lngRow = target.Row + 1& For Each tbl In cat.Tables lngCol = target.Column ws.Cells(lngRow, lngCol) = tbl.Name ws.Cells(lngRow, lngCol + 1&) = tbl.Type ws.Cells(lngRow, lngCol + 2&) = tbl.DateCreated ws.Cells(lngRow, lngCol + 3&) = tbl.DateModified lngRow = lngRow + 1& Next ws.UsedRange.Columns.AutoFit End Sub 

编辑:

从技术上讲,你甚至可以完成这个任务,甚至没有写任何代码…所有… 0行的最佳scheme:)这是如何:

 - 打开你想要查询的数据库。
 - 转到工具>安全性>用户和组权限。
 - 在标有“用户/组名称”的框中,select“pipe理员”。
 - 在标有“对象名称”的框中select“MysObjects”。
 - 在标记为“权限”的区域(正下方),勾选名为“读取数据”的框
 - 点击确定closures数据库。
 - 打开Excel。
 - 转到数据>导入外部数据>新build数据库查询。
 - selectMS Access数据库。
 - 取消选中“使用查询向导”。
 - 点击确定。
 - 浏览到数据库。
 - 点击选项。
 - 检查“系统表”。
 - 点击确定。
 - build立你的查询。
 - 点击closures。
 - 现在点击查看,然后点击SQL。
 - 粘贴你的SQL。
 - 现在通过右上angular的红色Xclosures窗口,系统会提示您input目的地范围。 
 - 多田

在Excel中,可以使用ADO(ActiveX数据对象)直接使用Access数据库。 在Excel中使用ADO之前,需要通过Visual Basic编辑器中的工具>引用来引用相应的库(例如Microsoft ActiveX Data Objects 2.8库)。 这个页面应该让你开始如何使用ADO。

您可能会发现使用Connection对象的OpenSchema方法的示例返回数据库中表的名称,并且这个连接到Access数据库的示例非常有用