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 arbetsbladExemplet 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:
- Max 255 tecken per post
- Antal poster är begränsade till 5461 st
- Kan inte hantera s k Null-värden
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ärDetta 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