Как запросить таблицу MS-Access из MS-Excel (2010) с помощью VBA - PullRequest
13 голосов
/ 21 октября 2011

Я пытаюсь написать некоторый код VBA в Excel для запроса таблицы в Access.Я пробовал несколько примеров кода для этого, таких как добавленные ссылки, и они все, кажется, терпят неудачу в части "Открытого соединения".Я пробовал использовать разные ссылки, но я не уверен, какие из них следует использовать, в чем различия между некоторыми из разных версий (например, объекты данных Microsoft ActiveX 2.0,2.1, ..., 6.0) или какова информация о поставщикедолжно быть.Для информации о провайдере я обычно вижу что-то вроде

"Provider = Microsoft.Jet.OLEDB.4.0; Источник данных ="

Но яЯ не уверен, что это то, что мне нужно использовать, или почему / какие условия что-либо в строке поставщика, показанной выше, должно измениться.Может ли кто-нибудь рассказать мне, как правильно делать подобные вещи?

Примечание: Если это вообще возможно, я бы хотел, чтобы решение работало без загрузки какого-либо другого приложения и работало бы как на 2007, так и на 2010 год.версии Access и Excel, так как для этого потребуется запуск на разных компьютерах с, возможно, разными версиями office.

Ссылки на похожие вопросы: Сбой запроса VBA к Excel http://www.mrexcel.com/forum/showthread.php?t=527490

Код:

Sub asdf()

strFile = "C:\Users\bwall\Desktop\Excel Query Access Testing"

Dim cn As Object
Dim rs As Object
Dim strSql As String
Dim strConnection As String
Dim AppPath As String
Set cn = CreateObject("ADODB.Connection")
AppPath = Application.ActiveWorkbook.Path


strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & AppPath & "\Masterlist_Current_copy.accdb;"
Debug.Print strConnection
strSql = "SELECT [Neptune Number],[Description],[Manufacturer],[Manufacturer P/N] FROM [All Components];"
cn.Open strConnection
Set rs = cn.Execute(strSql)
MsgBox rs.Fields(0) & " rows in MyTable"
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

End Sub  

Значение strConnection =

Поставщик = Microsoft.Jet.OLEDB.4.0; Источник данных = C: \ Users\ bwall \ Desktop \ Тестирование доступа к Excel-запросам \ Masterlist_Current_copy.accdb;

Ответы [ 3 ]

20 голосов
/ 21 октября 2011

Часть провайдера должна быть Provider=Microsoft.ACE.OLEDB.12.0, если ваша целевая база данных имеет формат ACCDB. Provider=Microsoft.Jet.OLEDB.4.0 работает только для более старого формата MDB.

Вам не нужно даже устанавливать Access, если вы используете 32-битную Windows. Jet 4 входит в состав операционной системы. Если вы используете 64-битную Windows, Jet 4 не входит в комплект, но вам все равно не нужен сам Access. Вы можете установить Microsoft Access Database Engine 2010 распространяемый . Обязательно загрузите подходящую версию (AccessDatabaseEngine.exe для 32-разрядной версии Windows или AccessDatabaseEngine_x64.exe для 64-разрядной версии).

Вы можете избежать проблемы, касающейся ссылки на версию ADO, используя позднее связывание, которое не требует никаких ссылок.

Dim conn As Object
Set conn = CreateObject("ADODB.Connection")

Затем присвойте свое свойство ConnectionString объекту conn. Вот быстрый пример, который запускается из модуля кода в Excel 2003 и отображает окно сообщения с количеством строк для MyTable. Он использует позднюю привязку для объектов подключения ADO и набора записей, поэтому не требует установки ссылки.

Public Sub foo()
    Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Access\webforums\whiteboard2003.mdb"
    strSql = "SELECT Count(*) FROM MyTable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.fields(0) & " rows in MyTable"
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

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

6 голосов
/ 04 июня 2013
Sub Button1_Click()
Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Documents and Settings\XXXXXX\My Documents\my_access_table.accdb"
    strSql = "SELECT Count(*) FROM mytable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.Fields(0) & " rows in MyTable"

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub
0 голосов
/ 19 января 2019

Все, что вам нужно, это ADODB.Connection

Dim cnn As ADODB.Connection ' Requieres reference to the
Dim rs As ADODB.Recordset   ' Microsoft ActiveX Data Objects Library

Set cnn = CreateObject("adodb.Connection")
cnn.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Access\webforums\whiteboard2003.mdb;"

Set rs = cnn.Execute(SQLQuery) ' Retrieve the data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...