Först publicerad: 2012-02-14

Import: från stängd Excelbok (ADO)

Med hjälp av ADO (ActiveX Data Objects) så möjliggörs att från ett kalkylark importera data från en annan Excelbok, och detta utan att denna externa bok överhuvudtaget behöver öppnas.

Importen är i normalfallet snabb, och kan vara ett bra sätt att effektivisera periodvisa rutiner på.

Steg 1: En indatafil i Excel

Indatafilen, dvs den Excelfil som vi kommer att importera data från, kan vara vilken Excelbok som helst. I det här exemplet ser vår indatafil ut så här:

Innehållet i den Excelfil vars data vi ska importera via ADO.

Steg 2: En Excelfil som innehåller makrot för importen

Även denna bok kan vara en helt vanlig Excelbok, med den lilla skillnaden att alla Excelböcker som innehåller makron måste sparas i formatet ”.xlsm” (fr o m Excel 2007).

När vi har vår ”makrobok” på plats så är det dags att skriva in makrokoden i VBA. Tryck Alt + F11 för att öppna VBA-hanteraren. Skapa därefter en ny modul enligt  bilden nedan:

Lägg till en ny modul i VBA-hanteraren.

3. Lägg in följande makrokod i den nya modulen

 

Sub ImporteraExcelTillExcel_ADO()
 
'--------------------------------------------------------------
'importerar data från en extern Excelbok utan att öppna den
'--------------------------------------------------------------
 
'variabeldeklareringar
Dim datConnection As ADODB.Connection
Dim recSet As ADODB.Recordset
Dim recRubrik As ADODB.Field
Dim strDB, strSQL As String
Dim strDriver As String
Dim i As Long
 
'sökväg till den externa Excelfilen
strDB = ThisWorkbook.Path & "\" & "MinExcelFil.xlsx" 'filen i samma folder
'strDB = "C:\ExcelVBA\MinExcelFil.xlsx" 'filen i annan folder
 
'uppkoppling
Set datConnection = New ADODB.Connection
Set recSet = New ADODB.Recordset
strDriver = "DRIVER=Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)"
datConnection.Open "DBQ=" & strDB & ";" & strDriver & ";UID=admin;"
 
'SQL-förfrågan
strSQL = "SELECT * FROM [Sheet1$A1:Z9999]" 'cellområde på visst ark
'strSQL = "SELECT * FROM [Cellområdesnamn]" 'för namngivna cellområden
 
'öppnar ett "recordset"
recSet.Open strSQL, datConnection, adOpenStatic
 
'kopierar in ny data
ActiveSheet.Range("A2").CopyFromRecordset recSet
 
'kopierar kolumnrubriker
i = 1
For Each recRubrik In recSet.Fields
 ActiveSheet.Cells(1, i) = _
  recRubrik.Name: i = i + 1
Next recRubrik
 
'kopplar ned (viktigt!)
recSet.Close
datConnection.Close
 
'stänger ned objekten (viktigt!)
Set recSet = Nothing
Set datConnection = Nothing
 
End Sub

4. Justeringar av makrokoden

I exempelkoden så finns det två delar som du bör justera, nämligen

  • sökväg till den externa Excelfilen (ange sökväg till önskad fil)
  • SQL-förfrågan (ange vilket cellområde som ska importeras, alternativt ett namngivet område)

5. Ladda in ADO-objekten i VBA

Detta kanske låter mycket svårare än det är. Vad det handlar om är att vi måste ”slå på” VBA:s funktion för att kunna hantera ADO. Detta gör du ”en gång för alla” för just den här Excelboken. Nedanstående bild visar exakt hur du går tillväga:

Aktivering av ADO-bibliotek i Excel VBA.

 

6. Testkör importen

Gå därefter tillbaks ut till kalkylbladet och testkör makrot. Importen av den testfil som introducerades i början av den här artikeln ger följande slutresultat:

Resultatet av ADO-importen från Excel till Excel.

Som man kan se så har all data importerats, inklusive kolumnrubrikerna. Det enda som inte importeras är cellformat (kolumnrubrikerna var skrivna i fetstil i orginalfilen).

7. Du glömmer väl inte…

att först av allt göra säkerhetskopia på alla filer som du håller på och trixar med? Detta gäller förstås alltid, och inte minst om man tankar in och ut via ADO, eftersom innehåll skrivs över ”i det tysta”.