Import av statisk data från Access


Här demonstreras hur vi automatiskt kan hämta önskade uppgifter från en tabell i en databas till ett arbetsblad samt hur vi kan läsa in data till en combobox i ett formulär.

I exemplet används ADO (Microsoft ActiveX Data Objects Library) för import av data till Excel.

Saknas ADO-biblioteket på din dator kan den hämtas från Microsofts databashemsida. Det kan vara aktuellt för dig som använder Excel 97 med ett äldre operativsystem än Windows 2000.

Innan proceduren körs måste en referens sättas till ADO:s bibliotek:
Det sker på följande sätt:

1. Öppna VB-Editorn i Excel.

2. Välj kommandot Verktyg | Referenser...

3. Kryssa för Microsoft ActiveX Data Objects x.x Library

 

Importera statisk data till arbetsblad

Exemplet bygger på en mycket enkel Accessdatabas - XLData.mdb.
I den finns en tabell (tblNamn) där fältnamnen består av "Räknare" och "Namn".

Transpose-funktionen, som används i koden nedan, är begränsad i en rad avseenden (gäller för version 97 och 2000):

 

Om ett felmeddelande erhålls vid kopiering till VBA-modul så läs mer här»
 

 

(© 2002 - 2003 All rights Colo - Used by permission)

Option Explicit  

Sub Importera_AccessData()

   '© 2003 Alla rättigheter XL-Dennis

   Dim cnt As ADODB.Connection

   Dim rst As ADODB.Recordset

   Dim stDB As String, stSQL As String

   Dim wsBlad As Worksheet

   Dim lnAntalFalt As Long, lnAntal As Long

 

   Set cnt = New ADODB.Connection

   Set rst = New ADODB.Recordset

   Set wsBlad = ThisWorkbook.Worksheets(1)

 

   'Sökväg till databasen

   stDB = ThisWorkbook.Path & "\" & "XLData1.mdb"

   stSQL = "SELECT * FROM tblData"

 

   'Ta bort tidigare hämtade uppgifter

   wsBlad.Range("A1").CurrentRegion.Clear

 

   'Här skapas databasanslutningen och urvalet sker mha SQL-sats.

   cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

         "Data Source=" & stDB & ";"

 

   rst.Open stSQL, cnt

 

   'Här överförs respektive fältnamn från tabellen tblNAmn.

   lnAntalFalt = rst.Fields.Count

 

   For lnAntal = 0 To lnAntalFalt - 1

      wsBlad.Cells(1, lnAntal + 1).Value = rst.Fields(lnAntal).Name

   Next

   '******************XL-97***********************************  

   'Istället för att använda sig av ADO kan vi använda DAO - Se Importera

   'textfiler med fler poster än 65536 st.

   Dim vaData As Variant

   Dim lnRad As Long, lnKol As Long

   Dim lnPoster As Long, lnFalt As Long

 

   'Här läses alla poster in i en matris.

   vaData = rst.GetRows()

 

   'Här identifieras antal poster och fält.

   lnPoster = UBound(vaData, 2) + 1

   lnFalt = UBound(vaData, 1) + 1

 

   'Här skrivs värdena till kalkylbladet.

   For lnRad = 2 To lnPoster

      For lnKol = 1 To lnFalt

         Cells(lnRad, lnKol).Value = vaData(lnKol - 1, lnRad - 2)

      Next lnKol

   Next lnRad

 

   '******************XL- 2000 / 2002 ***************************  

   'Här kopieras data till arbetsbladet.

   wsBlad.Cells(2, 1).CopyFromRecordset rst

 

   'Tar bort objekten från arbetsminnet och samtidigt kopplas anslutningen ned.

   rst.Close

   Set rst = Nothing

   cnt.Close

   Set cnt = Nothing

End Sub

 

Importera data till en combobox i ett formulär

Option Explicit  

Private Sub UserForm_Initialize()

   '© 2003 Alla rättigheter XL-Dennis

   Dim cnt As ADODB.Connection

   Dim rst As ADODB.Recordset

   Dim stDB As String

 

   Set cnt = New ADODB.Connection

   Set rst = New ADODB.Recordset

 

   stDB = ThisWorkbook.Path & "\" & "XLData.mdb"

 

   'Här skapas databasanslutningen.

   cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

         "Data Source=" & stDB & ";"

 

   'Här öppnas tabellen tblNamn .

   rst.Open "tblNamn", cnt, adOpenForwardOnly, _

         adLockReadOnly, adCmdTableDirect

 

   'Här läses samtliga poster in till comboboxen.

   With Me.ComboBox1

      .Clear

      Do Until rst.EOF

         .AddItem rst!Namn

         rst.MoveNext

      Loop

      .ListIndex = -1

   End With

 

   'Kopplar ned anslutningen och tömmer arbetsminnet.

   rst.Close

   Set rst = Nothing

   cnt.Close

   Set cnt = Nothing

End Sub