2012-01-31 2 views
10

Я пишу приложение excel, которое извлекается из базы данных Access для работы. Когда пользователь открывает инструмент Excel, таблица данных должна заполнять один из рабочих листов из базы данных Access, которую я создал. Я писал код VBA в excel, и я получаю ошибку во время выполнения: «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», отмеченная галочкой, это тот случай? если да, то какая версия? –

+0

У меня есть «Библиотека объектов Microsoft DAO 3.6». Теперь он дает мне ошибку времени выполнения 3024 Определенная приложением или объектная ошибка – thebiglebowski11

+0

Это похоже на не найденный файл, конечно, путь правильный? –

ответ

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 букв для вопроса, который автоматически приходит в голову, когда происходит ошибка :) –

+0

Это не имеет большого смысла ... MsgBox читает: Ошибка Описание: Не удалось найти файл 'D: \ Tool_Database \ Tool_Database.mdb Ошибка в строке: 0 Номер ошибки: -2147467259 – thebiglebowski11

+0

Это, безусловно, местоположение моей базы данных ... – thebiglebowski11

0

Он отлично работает на моей машине (за исключением названия полей перезаписан и первой строки данных - для имен полей вы, вероятно, означает TargetRange.Offset (0 , intColIndex)).

У вас есть Инструменты -> Ссылки ... в библиотеку объектов Microsoft DAO 3.6?

Возможно, вы используете 64-разрядную версию Excel 2010 (проверьте в разделе «Файл-> Справка» в разделе «О Microsoft Excel»)? Если это так, библиотеки DAO старой версии не будут работать, и вам потребуется установить 64-разрядную библиотеку ACE DAO, которая доступна для 64-разрядных.

+0

Я фактически запускаю файл через удаленный сервер. Однако я буду искать библиотеку 3.6. Код должен в конечном итоге скопировать базу данных и поместить ее в рабочий лист, верно? – thebiglebowski11

+1

Он работает на моей машине. Я сделал новый .mdb с одной таблицей, вставил ваш код в новую Рабочую книгу, добавил Tools-> Reference to DAO 3.6, изменил путь DBFullName и сработал. – Govert

3

И DAO, и ADO включают типы объектов набора записей. Однако они несовместимы. Ваше объявление для переменной объекта rs неоднозначно.

Dim db As DAO.Database, rs As Recordset 

Потенциальная проблема заключается в том, что если ваш проект включает в себя ссылку на ADO, и приоритет этой ссылки выше справки DAO, rs будет заводиться как набор записей ADO, а не DAO записей.

Я не уверен, что это причина ошибки, которую вы видите. Однако установка rs по номеру db.OpenRecordset(something) должна завершиться неудачей, если rs - это набор записей ADO, потому что OpenRecordset возвращает набор записей DAO.

Я думаю, вы должны изменить объявление к этому:

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

Даже если это изменение не помогает решить проблему, я призываю вас всегда квалифицировать тип при объявлении переменных объекта ... записей чтобы избежать двусмысленности.

И если это не исправить, сообщите нам, какая строка вашего кода вызывает текущую ошибку, которую вы видите.

Вот еще один красный флаг:

Dim TargetRande As String 

Позже у вас есть:

Set TargetRange = Range("A1") 

Option Explict Добавить в разделе объявлений модуля. Затем выберите Debug-> Compile в главном меню редактора VB. Эти усилия будут выделять имена переменных с ошибками, а также предупреждать вас о синтаксических ошибках.

Смежные вопросы