Importera filtrerad statisk
data från Access
Här demonstreras hur vi automatiskt kan hämta filtrerad data från en tabell i en databas till ett arbetsblad.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 Excel.
2. Välj kommandot Verktyg | Referenser...
3. Kryssa för Microsoft ActiveX Data Objects x.x Library
En enkel databas ligger till grund för exemplet och består endast av en tabell - tblNamn.
Tabellen har följande fältnamn: Räknare, Namn, Avdelning och Lön.I exemplet används en kombinationsruta (combobox) i det berörda arbetsbladet för att underlätta valen. Texten för de olika valen i denna procedur (se nedan) följer huvudprocedurens struktur och förklarar därmed de olika SELECT-satserna.
Procedurerna får kopieras manuellt till en arbetsbok.
Följande procedur placeras i modulen ThisWorkbook / DennaArbetsbok:
Option Explicit
Private Sub Workbook_Open()
'© 2003 Alla rättigheter XL-Dennis
Worksheets("Blad1").Shapes("cmbFilter").ControlFormat.List = _
Array( _
"Alla fält och alla poster där Lön >= 17.000 kr", _
"Poster där Lön > = 16.000 kr och Avdelning BB", _
"Poster där Lön > = 16.000 kr och Avdelning VV", _
"Poster där Lön >= 16.000 kr eller Avdelning BB", _
"Namn och Lön och där Lön >= 16.000 kr och Avdelning BB", _
"Unika värden Lön", _
"Alla fält Avdelning AA och BB", _
"Alla fält Avdelning AA och BB med Lön >=18.000 Kr", _
"Namn som börjar på D eller Lön <= 20.000 Kr - Namnsorterad stigande", _
"Namn som börjar på D eller Lön <= 20.000 Kr - Namsorterad fallande", _
"Alla fält och endast Löneintervall 17 - 19.000 Kr", _
"Alla fält och utan Löner i intervallet 17 - 19.000 Kr")
End Sub
Följande procedur placeras i en standardmodul:
Option Explicit
Sub Importera_FiltreradData_Access1()
'© 2003 Alla rättigheter XL-Dennis
Dim cnt As ADODB.Connection
Dim rst As ADODB.Recordset
Dim stDB As String
Dim lnAntalFalt As Long, lnAntal As Long, lnVal As Integer
Set cnt = New ADODB.Connection
Set rst = New ADODB.Recordset
stDB = ThisWorkbook.Path & "\" & "XLData.mdb"
'Ta bort tidigare hämtade uppgifter
Range("A1").CurrentRegion.Clear
'Här läses det valda Indexvärdet in
With Shapes("cmbFilter").ControlFormat
If .ListIndex <> 0 Then
lnVal = .ListIndex
Else
Exit Sub
End If
End With
'Här skapas databasanslutningen
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & stDB & ";"
'Filtrering sker med SQL och Select Case styr urvalet.
Select Case lnVal
Case 1
rst.Open "SELECT * FROM tblNamn WHERE [Lön] >=17000", cnt
Case 2
rst.Open "SELECT * FROM tblNamn WHERE [Lön]>=16000 AND [Avdelning]='BB'", cnt
Case 3
rst.Open "SELECT * FROM tblNamn WHERE [Lön]>=16000 AND [Avdelning] LIKE 'VV'", cnt
Case 4
rst.Open "SELECT * FROM tblNamn WHERE [Lön]>=16000 OR [Avdelning]='BB'", cnt
Case 5
'Denna sats ska vara på en rad:
rst.Open "SELECT [Namn], [Lön] FROM tblNamn WHERE [Lön]>=16000 AND [Avdelning] _
LIKE 'BB'", cntCase 6
rst.Open "SELECT DISTINCT [Lön] FROM tblNamn", cnt
Case 7
rst.Open "SELECT * FROM tblNamn WHERE [Avdelning] IN ('AA', 'BB')", cnt
Case 8
rst.Open "SELECT * FROM tblNamn WHERE [Avdelning] IN ('AA', 'BB') AND [Lön]>=18000", cnt
Case 9
rst.Open "SELECT [Namn], [Lön] FROM tblNamn WHERE [Namn] LIKE 'D' OR [Lön]<=20000", cnt
Case 10
'Denna sats ska vara på en rad:
rst.Open "SELECT [Namn], [Lön] FROM tblNamn WHERE [Namn] LIKE 'D' OR [Lön]<=20000 _
ORDER BY [Namn] DESC", cntCase 11
rst.Open "SELECT * FROM tblNamn WHERE [Lön] BETWEEN 17000 AND 19000", cnt
Case 12
rst.Open "SELECT * FROM tblNamn WHERE [Lön] NOT BETWEEN 17000 AND 19000", cnt
End Select
'Här överförs respektive fältnamn från tabellen tblNAmn.
lnAntalFalt = rst.Fields.Count
For lnAntal = 0 To lnAntalFalt - 1
Cells(1, lnAntal + 1).Value = rst.Fields(lnAntal).Name
Next lnAntal
'Här kopieras data till arbetsbladet.
Cells(2, 1).CopyFromRecordset rst
'Kopplar ned anslutningen och tömmer arbetsminnet.
rst.Close
Set rst = Nothing
cnt.Close
Set cnt = Nothing
End Sub