考虑初始化数据库和Recordset对象之前调用访问对象。此外,使用OpenCurrentDatabase方法,因为OpenDatabase用于DBEngine工作区对象。
Sub Query()
Dim accObj As Object
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim sql As String
Dim iCol As Integer
Sheets("DataDump1").Cells.ClearContents
Set accObj = CreateObject("Access.Application")
accObj.OpenCurrentDatabase("C:\Folder\DatabaseName.accdb")
Set db = accObj.CurrentDb
Set rst = db.OpenRecordset("Query 1")
For iCol = 1 To rst.Fields.Count
Sheets("DataDump1").Cells(1, iCol) = rst.Fields(iCol - 1).Name
Next iCol
Sheets("DataDump1").Range("A2").CopyFromRecordset rst
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
Set accObj = Nothing
End Sub
可替代地,不需要与访问对象的访问的接口是一个数据库而不仅仅是一个.exe所以可以通过ODBC/OLEDB连接像任何其他RDMS(甲骨文,SQL服务器,MySQL的等)
Sub RunSQL()
Dim conn As Object, rst As Object
Dim strConnection As String, strSQL As String
Dim iCol As Integer
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Sheets("DataDump1").Cells.ClearContents
' strConnection = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};" _
' & "DBQ=C:\Folder\DatabaseName.accdb;"
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source='C:\Folder\DatabaseName.accdb';"
strSQL = " SELECT * FROM [Query 1];"
' OPEN DB AND RECORDSET
conn.Open strConnection
rst.Open strSQL, conn
' COLUMN HEADERS
For iCol = 1 To rst.Fields.Count
Sheets("DataDump1").Cells(1, iCol) = rst.Fields(iCol - 1).Name
Next iCol
' DATA ROWS
Sheets("DataDump1").Range("A2").CopyFromRecordset rst
rst.Close
conn.Close
End Sub
谢谢你,你的第二个解决方案对我来说非常合适。 – JBlack
太棒了!并且请注意,第二个选项不需要在用户机器上安装MSAccess.exe。只需安装.accdb文件和一台PC(应安装Ace/Jet引擎-Windows .dll文件)。 – Parfait