编写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))。
你有一个工具 – >参考…到Microsoft DAO 3.6对象库吗?
您是否正在使用64位版本的Excel 2010(请查看“关于Microsoft Excel”部分中的文件 – >帮助)? 如果是这样,旧版本的DAO库将无法工作,您需要安装适用于64位的64位ACE DAO库。