2012-01-31 19 views
10

我正在編寫一個從Access數據庫中繪製的Excel工作應用程序。當用戶打開Excel工具時,數據表需要從我創建的Access數據庫填充其中一個工作表。我一直在Excel中編寫VBA代碼,並且收到運行時錯誤:「429」ActiveX組件無法創建對象。編寫Excel VBA從Access中接收數據

其他問題都是從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 
+0

在IDE中,工具 - >引用;你需要「microsoft dao X.XX object library」打勾,是這樣嗎?如果是的話哪個版本? – 2012-01-31 16:44:11

+0

我有「Microsoft DAO 3.6對象庫」選中。現在它給了我運行時錯誤3024應用程序定義或對象定義的錯誤 – thebiglebowski11 2012-01-31 16:47:17

+0

這似乎是文件未找到,確定路徑是正確的? – 2012-01-31 16:49:17

回答

8

泰勒,你能爲我測試這段代碼嗎?如果你有任何錯誤,你會得到一個消息框。只需發佈消息框的快照。

'~~> 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 
+1

是啊:)我一直在使用它已經有一段時間了。你不想知道我以前使用的是什麼:-D提示:這是一個3字母縮寫,當一個錯誤發生時我們會自動想到這個問題:) – 2012-01-31 19:03:06

+0

這沒什麼意義...... MsgBox讀取: 錯誤描述:找不到文件'D:\ Tool_Database \ Tool_Database.mdb 錯誤在行:0 錯誤號:-2147467259 – thebiglebowski11 2012-01-31 19:20:48

+0

那肯定是我的數據庫的位置... – thebiglebowski11 2012-01-31 19:22:07

0

它的工作原理在我的機器上細(除了字段名得到由數據的第一行覆蓋 - 字段名稱的您可能意味着TargetRange.Offset(0 ,intColIndex))。

你有工具 - >參考...到M​​icrosoft DAO 3.6對象庫嗎?

您是否正在使用64位版本的Excel 2010(在「關於Microsoft Excel」部分的文件 - >幫助下檢查)?如果是這樣,舊版本的DAO庫將無法工作,並且您需要安裝適用於64位的64位ACE DAO庫。

+0

我實際上是通過遠程服務器運行文件。儘管如此,我會尋找3.6的圖書館。代碼應該最終複製數據庫並將其放入工作表中,對嗎? – thebiglebowski11 2012-01-31 17:08:00

+1

它適用於我的機器。我用一張表創建了一個新的.mdb,將你的代碼粘貼到一個新的工作簿中,將Tools-> Reference添加到DAO 3.6中,更改了DBFullName路徑並且它工作正常。 – Govert 2012-01-31 19:37:28

3

DAO和ADO都包含記錄集對象類型。但是它們不兼容。您對rs對象變量的聲明不明確。

Dim db As DAO.Database, rs As Recordset 

一個潛在的問題是,如果你的項目包括對ADO參考,並參照的優先級高於你的DAO參考,rs會倒閉的ADO記錄集,而不是DAO記錄。

我不確定這是您看到的錯誤的原因。但是,如果rs是ADO記錄集,則設置rsdb.OpenRecordset(something)應該失敗,因爲OpenRecordset會返回DAO記錄集。

我想你應該申報改成這樣:

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

即使這種變化不會解決你的問題,我建議你總是聲明Recordset對象變量時限定型...避免含糊不清。

如果這不是修復,請告訴我們您的代碼的哪一行觸發了您所看到的當前錯誤。

這裏是另一個紅旗:

Dim TargetRande As String 

以後你:

Set TargetRange = Range("A1") 

添加Option Explict到您的模塊的聲明部分。然後從VB編輯器的主菜單中選擇Debug-> Compile。該工作將突出顯示拼寫錯誤的變量名稱,並提醒您語法錯誤。