Först publicerad: 2009-06-03

Import: Access-tabell i Excel via VBA

about-accessAccess är ju sedan länge en del av Office-sviten och det finns därför ett stort antal Access-databaser runt om på företag. I det här exemplet kommer vi att exportera en Access-tabell till Excel via programkod i Excel VBA.

Detta moment kan i och för sig även utföras via menyer i Access, men vi utgår från att vi vill kunna automatisera den här importen via ett Excelmakro.

Ett tänkbart scenario är att du varje dag exporterar Access-data till Excel. En perfekt lösning är en enkel uppsättning Excelmakron som automatiserar det här arbetet åt dig.

ADO – ActiveX Data Objects

I exemplet skapar vi en koppling från Excel till Access via ADO (ActiveX Data Objects) som är en teknik för att koppla upp sig mot databaser och sedan hämta in datan via så kallade recordsets. Tekniken introducerades 1996 av Microsoft och används i en stor rad sammanhang.

Efter att databasen har kopplats upp mot Excel så exporteras sedan all data från Access till aktivt kalkylblad.

Ladda in ADO-objekten i Excel

För att vi skall kunna nyttja ADO så måste vi i Excels VBA-editor ladda in ADO-objekten.
Detta gör du via Tools – References i VBA-editorn. Se bilden nedan:

access-excel-ado-objects

VBA-kod för att importera Access-tabell i Excel

I kodexemplet så kopplar vi upp oss mot Accessdatabasen db.mdb (eller db.accdb om databasen är sparad i Accessversion 2007 eller nyare) som ligger i samma folder som aktiv Excelfil. Du ser i koden nedan hur du skriver för att peka på en databas som ligger i en annan folder.

strDB = ThisWorkbook.Path & "\" & "db.mdb"
'strDB = "C:\vba\db.mdb" 'om i annan folder

Du måste också ange namnet på den specifika tabell i Access som du vill hämta data från:

strTabell = "pengar_2011"

Nedan ser du den kompletta koden som utför operationen.

Databas: Access 2003 eller tidigare

Sub Importera_Access_I_Excel()
 
'dimensions
Dim datConnection As ADODB.Connection
Dim recSet As ADODB.Recordset
Dim strDB, strSQL As String
Dim strTabell As String
Dim lngTabeller As Long
Dim i As Long
 
'välj en av dessa sökvägar till din Accessdatabas (t ex db.mdb)
strDB = ThisWorkbook.Path & "\" & "db.mdb"
'strDB = "C:\vba\db.mdb" 'om i annan folder
 
'namn på tabellen i Access
strTabell = "pengar_2011"
 
'skapa ADO-kopplingen
Set datConnection = New ADODB.Connection
Set recSet = New ADODB.Recordset
datConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source =" & strDB & ";"
 
'SQL-förfrågan
strSQL = "SELECT * FROM " & strTabell & ""
recSet.Open strSQL, datConnection
 
'kopierar data till kalkylbladet (från och med rad 2 i Excel)
ActiveSheet.Cells(2, 1).CopyFromRecordset recSet
 
'kopierar kolumnrubriker (rad 1 i Excel)
lngCampos = recSet.Fields.Count
For i = 0 To lngCampos - 1
ActiveSheet.Cells(1, i + 1).Value = recSet.Fields(i).Name
Next
 
'kopplar ned
recSet.Close: Set recSet = Nothing
datConnection.Close: Set datConnection = Nothing
 
End Sub

Databas: Access 2007

Sub Importera_Access_I_Excel()
 
'dimensions
Dim datConnection As ADODB.Connection
Dim recSet As ADODB.Recordset
Dim strDB, strSQL As String
Dim strTabell As String
Dim lngTabeller As Long
Dim i As Long
 
'välj en av dessa sökvägar till din Accessdatabas (t ex db.mdb)
strDB = ThisWorkbook.Path & "\" & "db.accdb"
'strDB = "C:\vba\db.mdb" 'om i annan folder
 
'namn på tabellen i Access
strTabell = "pengar_2011"
 
'skapa ADO-kopplingen
Set datConnection = New ADODB.Connection
Set recSet = New ADODB.Recordset
datConnection.Open "Provider=Microsoft.Ace.OLEDB.12.0; _
Persist Security Info = False;" & "Data Source =" & strDB & ";"
 
'SQL-förfrågan
strSQL = "SELECT * FROM " & strTabell & ""
recSet.Open strSQL, datConnection
 
'kopierar data till kalkylbladet (från och med rad 2 i Excel)
ActiveSheet.Cells(2, 1).CopyFromRecordset recSet
 
'kopierar kolumnrubriker (rad 1 i Excel)
lngCampos = recSet.Fields.Count
For i = 0 To lngCampos - 1
ActiveSheet.Cells(1, i + 1).Value = recSet.Fields(i).Name
Next
 
'kopplar ned
recSet.Close: Set recSet = Nothing
datConnection.Close: Set datConnection = Nothing
 
End Sub