Написание Excel VBA для получения данных из Access - PullRequest
10 голосов
/ 31 января 2012

Я пишу приложение Excel, которое опирается на базу данных Access для работы.Когда пользователь открывает инструмент Excel, таблица данных должна заполнить одну из рабочих таблиц из базы данных Access, которую я создал.Я пишу код VBA в Excel и получаю сообщение об ошибке во время выполнения: «429» ActiveX компонент не может создать объект.

Все остальные вопросы написаны из 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

Ответы [ 3 ]

8 голосов
/ 31 января 2012

Тайлер, не могли бы вы проверить этот код для меня?Если вы получите какую-либо ошибку, вы получите окно сообщения.Просто опубликуйте снимок окна сообщения.

'~~> 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
3 голосов
/ 31 января 2012

И 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.Это усилие выделит имена переменных с ошибками, а также предупредит вас о синтаксических ошибках.

0 голосов
/ 31 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...