Как запросить таблицу MS-Access из MS-Excel (2010) с помощью VBA
Я пытаюсь написать некоторый код VBA в Excel для запроса таблицы в Access. Я пробовал несколько примеров кода для этого, таких как добавленные ссылки, и они все, кажется, терпят неудачу в части "Открытого соединения". Я пробовал использовать разные ссылки, но я не уверен, какие из них следует использовать, в чем различия между некоторыми из разных версий (например, объекты данных Microsoft ActiveX 2.0,2.1,..., 6.0) или какова информация о поставщике должно быть. Для информации о поставщике я обычно видел что-то вроде
"Поставщик = Microsoft.Jet.OLEDB.4.0; Источник данных ="
Но я не уверен, что это то, что мне нужно использовать, или почему/какие условия что-либо в строке поставщика, показанной выше, должно измениться. Может кто-нибудь объяснить мне, как правильно делать такие вещи?
Примечание. Если это вообще возможно, я хотел бы получить решение, которое бы работало без загрузки какого-либо другого приложения и работало бы как в версиях Access, так и в Excel как в 2007, так и в 2010 году, поскольку оно должно работать на разных компьютерах с, возможно, различными версиями 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 =
Provider = Microsoft.Jet.OLEDB.4.0; Источник данных = C:\Users\bwall\Desktop\Тестирование доступа к запросам Excel\Masterlist_Current_copy.accdb;
Ответы
Ответ 1
Провайдер должен быть Provider=Microsoft.ACE.OLEDB.12.0
, если ваша целевая база данных - это формат ACCDB. Provider=Microsoft.Jet.OLEDB.4.0
работает только для более старого формата MDB.
Вам даже не нужно устанавливать Access, если вы используете 32-битную Windows. Jet 4 входит в состав операционной системы. Если вы используете 64-битную Windows, Jet 4 не входит в комплект, но вам все равно не понадобится сам доступ. Вы можете установить Microsoft Access Database Engine 2010 Redistributable. Обязательно загрузите подходящую версию (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
Если этот ответ не решает проблему, отредактируйте свой вопрос, чтобы показать нам полную строку подключения, которую вы пытаетесь использовать, и точное сообщение об ошибке, которое вы получаете в ответ на эту строку соединения.
Ответ 2
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
Ответ 3
Все, что вам нужно, это 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