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, XLData1.mdb, ligger till grund för exemplet och består endast av en tabell - tblData.

Tabellen har följande fältnamn: Räknare, Nummer, Modell, In(Datum), Ut(Datum) Antal och Pris.

 

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_FiltreradData_Access1()

   '© 2001 Alla rättigheter XL-Dennis

   Dim cnt As ADODB.Connection

   Dim rst As ADODB.Recordset

   Dim stDB As String, stNummer As String, stSQL As String

   Dim lnAntalFalt As Long, lnAntal As Long

   Dim dtStartDatum As Date, dtSlutDatum As Date

 

   'Sökvägen till databasen.

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

 

   Set cnt = New ADODB.Connection

   Set rst = New ADODB.Recordset

 

   'Tar bort tidigare hämtade uppgifter i det aktiva arbetsbladet.

   Cells(1, 1).CurrentRegion.Clear

 

   'Här skapas anslutningen till databasen.

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

         "Data Source=" & stDB & ";"

 

   'Här hämtas uppgift om önskat nummer från användaren.

   stNummer = _

         Application.InputBox("Ange nummer (2):", "Urval - Steg 1", Default:="", Type:=1)

 

   'Här hämtas uppgift om önskat tidsintervall från användaren.

   'Startdatum

   dtStartDatum = _

         Application.InputBox("Ange Startdatum (2001-01-01):", "Urval - Steg 2", Default:="", Type:=2)

 

   'SlutDatum

   dtSlutDatum = _

         Application.InputBox("Ange Slutdatum (2001-10-01):", "Urval - Steg 3", Default:="", Type:=2)

 

   'Här sätts urvalet ihop till en SQL-sträng.

   stSQL = "SELECT [Nummer],[Modell],[Ut],[Antal]" _

         & " FROM tblData" _

         & " WHERE [In] >= # " & dtStartDatum & " # AND" _

         & " [Ut] <= # " & dtSlutDatum & " # AND" _

         & " [Nummer] = " & stNummer & "" _

         & " ORDER BY [Ut], [Modell];"

 

   With rst

      .CursorLocation = adUseClient

      .Open stSQL, cnt, adOpenForwardOnly, adLockReadOnly

   End With

 

   lnAntalFalt = rst.Fields.Count

   For lnAntal = 0 To lnAntalFalt - 1

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

   Next lnAntal

 

   '**************************Excel 97*************************
 
 'Istället för att använda sig av ADO kan vi använda DAO - Se:
   Importera textfiler med poster än 65536

   Dim vaData As Variant

   Dim rnData As Range

   Dim lnRad As Long, lnKol As Long

   Dim lnPoster As Long, lnFalt As Integer

 

   '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 data in i det aktiva arbetsbladet mha

   'TRANSPOSE-funktionen är dock begränsad till drygt 5400 poster

   'i versionerna 97 och 2000 av Excel.

   Set rnData = Range(Cells(2, 1), Cells(lnPoster + 1, lnFalt))

   rnData = Application.Transpose(vaData)

 

   '***********************Excel 2000 / 2002********************

   'Här kopieras data till arbetsbladet.

   Cells(2, 1).CopyFromRecordset rst

 

   Range(Cells(2, 3), Cells(65536, 3).End(xlUp)).NumberFormat _

         = "yyyy/mm/dd"

 

   'Kopplar ned anslutningen och tömmer arbetsminnet.

   rst.Close

   Set rst = Nothing

   cnt.Close

   Set cnt = Nothing

End Sub