I have a project that basically the goal is to generate Excel (Report) starting the Click of a button in Access using VBA.
The contents of this report is the result of a
You don't say what Office version, but in Excel 2007/10 a QueryTable is a property of a Listobject so your code would be like:
With MeuExcel.Worksheets.ListObjects.Add(Connection:=rs, Destination:=Range("A2")).QueryTable
In Access, you need to prefix the Excel application objects with the Excel application instance, for example:
With MeuExcel.Worksheets(4).QueryTables.Add( _
connection:=recordset, _
Destination:=Range("A2"))
End With
Furthermore, unless you have a reference to the Excel library, ypu will need to provide the value for built-in Excel constants.
It is a very bad idea to use the name of objects for variables. Do not say:
Dim recordset As recordset
Set recordset = New recordset
Say, for example:
Dim rs As recordset
Or much better:
Dim rs As New ADODB.Recordset
If you have a suitable reference. You can then skip CreateObject.
EDIT
The provider must be the Access OLEDB 10 provider, as used to bind recordsets. This works for me to create a data table via Access using SQL Server:
strConnect = "Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=True;" _
& "Data Source=XYZ\SQLEXPRESS;Integrated Security=SSPI;" _
& "Initial Catalog=TestDB;Data Provider=SQLOLEDB.1"
FWIW, two things stand out:
As @Remou pointed out, Excel references need to be qualified. Currently, Range("A2")
is unqualified. When running the code in Excel, the ActiveSheet
is assumed. However, when running from another application, that application will look for a method or property in its own library called Range
, which will give you that error in Microsoft Access.
There isn't any code in the With
block, so you can remove the With
and End With
keywords; when you do this also remove the outer (), like this:
wb.Worksheets(4).QueryTables.Add Connection:=rs, Destination:=wb.Worksheets(4).Range("A2")
Alternatively, shift the With
block to the Worksheet
level:
With wb.Worksheets(4)
.QueryTables.Add Connection:=rs, Destination:=.Range("A2")
End With
Update—Access to Excel Sample
This sample code automates Excel from Access, creating a new workbook and adding a Querytable to the first sheet. The source data is an Access table. This runs in Office 2007.
Public Sub ExportToExcel()
Dim appXL As Excel.Application
Dim wbk As Excel.Workbook
Dim wst As Excel.Worksheet
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set appXL = CreateObject("Excel.Application")
appXL.Visible = True
Set wbk = appXL.Workbooks.Add
Set wst = wbk.Worksheets(1)
Set cn = CurrentProject.AccessConnection
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
.Source = "SELECT * FROM tblTemp"
.Open
End With
With wst
.QueryTables.Add Connection:=rs, Destination:=.Range("A1")
.QueryTables(1).Refresh
End With
End Sub