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 och hur vi kan läsa in data till en combobox i ett formulär.

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

Saknas ADO-biblioteket på din dator kan den hämtas från Microsofts databashemsida. Det kan vara aktuellt för dig som använder XL 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 XL.

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

3. Bocka för ActiveX Data Objects x.x Library

Noterbart är att ingen felhantering visas i de nedanstående procedurerna.


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:


Exemplet hämtar fältnamn och poster mha följande procedur:

Sub Importera_AccessData()

   '© 2001 Alla rättigheter XL-Dennis

   'Reviderad 2003-03-03

   Dim cnt As New ADODB.Connection

   Dim rst As New ADODB.Recordset

   Dim stDB As String

   Dim wsBlad As Worksheet

   Dim lnAntalFalt As Long, lnAntal As Integer

 

   Set wsBlad = ThisWorkbook.Worksheets("Blad1")

 

   'Sökväg till databasen

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

 

   '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 "SELECT * FROM tblNamn", 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 iRad As Integer, iKol As Integer

   Dim iPoster As Integer, iFalt As Integer

 

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

   vaData = rst.GetRows()

 

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

   iPoster = UBound(vaData, 2) + 1

   iFalt = UBound(vaData, 1) + 1

 

   'Här skrivs värdena till kalkylbladet.

   For iRad = 2 To iPoster

      For iKol = 1 To iFalt

         Cells(iRad, iKol).Value = vaData(iKol - 1, iRad - 2)

      Next

   Next

 

   '******************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.

   Set rst = Nothing

   Set cnt = Nothing

End Sub


Importera data till en combobox i ett formulär

Detta exempel använder samma databas som ovan.

Sub Lasa_Data_ComboBox()
'© 2001 Alla rättigheter XL-Dennis
Dim cnt As New ADODB.Connection
Dim rstNamn As New ADODB.Recordset
Dim stDB As String

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 med sortering i stigande ordning
rstNamn.Open "Select * From tblNamn Order by Namn", _
     cnt, adOpenKeyset, adLockOptimistic, adCmdTableDirect

UserForm1.ComboBox1.Clear

'Här läses samtliga poster in till Comboboxen
Do Until rstNamn.EOF
     UserForm1.ComboBox1.AddItem rstNamn!Namn
     rstNamn.MoveNext
Loop

'Tar bort objekten från arbetsminnet och samtidigt kopplas
'anslutningen ned.
Set rstNamn = Nothing
Set cnt = Nothing

UserForm1.Show
End Sub