Exportera data från SQL Server 2000 till Excel


Här visas ett tips för hur vi kan hämta data från en SQL Server 2000 databas till en arbetsbok.

I exemplet används databasen Northwind och tipset  visar också hur vi kan använda oss av en s k subquery i kombination med SUM-funktionen i SQL-uttrycket.

Exemplet förutsätter att referenser till MS ADO 2.5 eller därutöver samt till MS Excel 8.0 eller därutöver har angivits.

Följande bild visar hur formuläret ser ut för exemplet:

 

Med några enklare justeringar kan exemplet fungera utmärkt i Excel-miljö också.

Option Explicit

'© 2004 Alla rättigheter XL-Dennis

 

Private cnt As ADODB.Connection

Private rst As ADODB.Recordset

 

'Konstanta sträng-värden

Const stCon As String = "Provider=SQLOLEDB.1;" & _

    "Integrated Security=SSPI;" & _

    "Persist Security Info=False;" & _

    "User ID=sa;" & _

    "Initial Catalog=Northwind;" & _

    "Data Source = DENWAL"

 

Const stSQL1 As String = "SELECT FirstName,LastName FROM Employees ORDER BY LastName"

 

Const stSQL2 As String = "SELECT DISTINCT ShipCity FROM Orders WHERE ShipCity LIKE 'M%'" _

    & " ORDER BY ShipCity"

 

Private Sub cmbCancel_Click()

  'Om användaren väljer att stänga programmet.

  Unload Me

End Sub

 

Private Sub cmbExport_Excel_Click()

  Dim stSQL As String, stName As String, stLName As String, stFName As String

  Const Separator As String = ","

  Dim xlApp As Excel.Application

  Dim xlwbBook As Excel.Workbook

  Dim xlwsSheet As Excel.Worksheet

  Dim xlRange As Excel.Range

 

  'Kontroll att värden har valts i båda combobox-objekten.

  With Me

    If .Combo1.ListIndex = -1 Then

      .Combo1.SetFocus

      MsgBox "En anställd måste väljas.", vbCritical

    ElseIf .Combo2.ListIndex = -1 Then

      .Combo2.SetFocus

      MsgBox "En skeppningshamn måste väljas.", vbCritical

    End If

  End With

 

  'Här delas den anställdes namn upp i två delar, för- och efternamn.

  'Funktionen Split kan användas istället om så önskas.

  stName = Me.Combo1.Text

  stLName = Mid(stName, 1, InStr(1, stName, Separator) - 1)

  stFName = Right(stName, Len(stName) - (InStr(1, stName, Separator) + 1))

 

  'SQL-uttrycket med en subquery.

  stSQL = "SELECT SUM(Freight) FROM Orders" _

      & " WHERE ShipCity = '" & Me.Combo2.Text & "'" _

      & " AND EmployeeID = (SELECT EmployeeID FROM Employees" _

      & " WHERE Lastname='" & stLName & "'" _

      & " AND Firstname ='" & stFName & "')"

 

  Set cnt = New ADODB.Connection

  Set rst = New ADODB.Recordset

 

  cnt.Open stCon

 

  With rst

    .CursorLocation = adUseClient

    .Open stSQL, cnt

    Set .ActiveConnection = Nothing

  End With

 

  'Kontroll om posten innehåller ett värde eller ett sk Null-värde.

  If IsNull(rst(0).Value) = True Then

    MsgBox "Ingen matchande post hittades!", vbInformation

    GoTo ExitHere

  End If

 

  Set xlApp = New Excel.Application

  'Skapar en ny arbetsbok med endast ett arbetsblad.

  Set xlwbBook = xlApp.Workbooks.Add(xlWBATWorksheet)

  Set xlwsSheet = xlwbBook.Worksheets(1)

  Set xlRange = xlwsSheet.Range("A2")

 

  'Transfererar det erhållna värdet.

  xlRange.CopyFromRecordset rst

 

  'Visar arbetsboken och aktiverar Excel-instansen.

  With xlApp

    .Visible = True

    .UserControl = True

  End With

 

  'Städar upp och frigör arbetsminne.

ExitHere:

  rst.Close

  Set rst = Nothing

  cnt.Close

  Set cnt = Nothing

 

  Set xlRange = Nothing

  Set xlwsSheet = Nothing

  Set xlwbBook = Nothing

  Set xlApp = Nothing

 

End Sub

 

Private Sub Form_Load()

  Set cnt = New ADODB.Connection

  Set rst = New ADODB.Recordset

  Dim i As Long

 

  cnt.Open stCon

 

  With rst

    .CursorLocation = adUseClient

    .Open stSQL1, cnt

    Set .ActiveConnection = Nothing

  End With

 

  'Läser in listvärden till combobox-objektet för anställda.

  With Me.Combo1

    .Clear

    Do Until rst.EOF

      .AddItem rst(1).Value & ", " & rst(0).Value

      rst.MoveNext

    Loop

    .ListIndex = -1

  End With

   'Stänger recordset.

  rst.Close

 

  With rst

    .CursorLocation = adUseClient

    .Open stSQL2, cnt

    Set .ActiveConnection = Nothing

  End With

 

  'Läser in listvärden till combobox-objektet för skeppninghamnar.

  With Me.Combo2

    .Clear

    Do Until rst.EOF

      .AddItem rst(0).Value

      rst.MoveNext

    Loop

    .ListIndex = -1

  End With

 

  'Stänger anslutningen och frigör arbetsminne.

  rst.Close

  Set rst = Nothing

  cnt.Close

  Set cnt = Nothing

 

End Sub