编写Excel VBA从Access接收数据

我正在写一个从Access数据库工作的Excel应用程序。 当用户打开Excel工具时,数据表需要从我创build的Access数据库中填充其中一个工作表。 我一直在Excel中编写VBA代码,并且收到运行时错误:“429”ActiveX组件无法创build对象。

其他的问题都是从Access编写的,但我相信我需要从Excel工作簿文件中编写的代码。 我写的代码在Workbook_Open()函数中,以便在用户打开文件时正确收集数据。 非常感谢您的帮助。 顺便说一下,我正在使用Access 2007和Excel 2010。

 Private Sub Workbook_Open() 'Will fill the first listbox with data from the Access database Dim DBFullName As String Dim TableName As String Dim FieldName As String Dim TargetRande As String DBFullName = "D:\Tool_Database\Tool_Database.mdb" Dim db As DAO.Database, rs As Recordset Dim intColIndex As Integer Set TargetRange = Range("A1") Set db = OpenDatabase(DBFullName) Set rs = db.OpenRecordset("SELECT * FROM ToolNames WHERE Item = 'Tool'", dbReadOnly) ' Write the field names For intColIndex = 0 To rs.Fields.Count - 1 TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name Next ' Write recordset TargetRange.Offset(1, 0).CopyFromRecordset rs Set rs = Nothing db.Close Set db = Nothing End Sub 

泰勒,你能为我testing这个代码吗? 如果你有任何错误,你会得到一个消息框。 只需发布消息框的快照。

 '~~> Remove all references as the below code uses Late Binding with ADO. Private Sub Workbook_Open() Dim cn As Object, rs As Object Dim intColIndex As Integer Dim DBFullName As String Dim TargetRange As Range 10 DBFullName = "D:\Tool_Database\Tool_Database.mdb" 20 On Error GoTo Whoa 30 Application.ScreenUpdating = False 40 Set TargetRange = Sheets("Sheet1").Range("A1") 50 Set cn = CreateObject("ADODB.Connection") 60 cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";" 70 Set rs = CreateObject("ADODB.Recordset") 80 rs.Open "SELECT * FROM ToolNames WHERE Item = 'Tool'", cn, , , adCmdText ' Write the field names 90 For intColIndex = 0 To rs.Fields.Count - 1 100 TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name 110 Next ' Write recordset 120 TargetRange.Offset(1, 0).CopyFromRecordset rs LetsContinue: 130 Application.ScreenUpdating = True 140 On Error Resume Next 150 rs.Close 160 Set rs = Nothing 170 cn.Close 180 Set cn = Nothing 190 On Error GoTo 0 200 Exit Sub Whoa: 210 MsgBox "Error Description :" & Err.Description & vbCrLf & _ "Error at line :" & Erl & vbCrLf & _ "Error Number :" & Err.Number 220 Resume LetsContinue End Sub 

DAO和ADO都包含logging集对象types。 但是它们不兼容。 您的rs对象variables的声明是不明确的。

 Dim db As DAO.Database, rs As Recordset 

一个潜在的问题是,如果你的项目包含对ADO的引用,并且该引用的优先级高于DAO引用,则rs将作为ADOlogging集而不是DAOlogging集。

我不确定这是你看到的错误的原因。 但是,如果rs是ADOlogging集,则将rs设置为db.OpenRecordset(something)会失败,因为OpenRecordset返回DAOlogging集。

我认为你应该改变这个声明:

 Dim db As DAO.Database, rs As DAO.Recordset 

即使这种改变不能解决你的问题,我鼓励你在声明logging集对象variables的时候始终限定types……以避免模糊。

如果这不是修复,请告诉我们你的代码的哪一行触发了你所看到的当前错误。

这是另一个红旗:

 Dim TargetRande As String 

以后你有:

 Set TargetRange = Range("A1") 

Option Explict添加到模块的声明部分。 然后从VB编辑器的主菜单中selectDebug-> Compile。 该工作将突出显示拼写错误的variables名称,并提醒您语法错误。

它在我的机器上工作正常(除了字段名称被第一行数据覆盖 – 对于字段名称,您可能意指TargetRange.Offset(0,intColIndex))。

你有一个工具 – >参考…到M​​icrosoft DAO 3.6对象库吗?

您是否正在使用64位版本的Excel 2010(请查看“关于Microsoft Excel”部分中的文件 – >帮助)? 如果是这样,旧版本的DAO库将无法工作,您需要安装适用于64位的64位ACE DAO库。