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:
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:
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:
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:
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”.