Od 2000 roku czyli już od ponad 20 lat Microsoft Office może bez problemu łączyć się w zasadzie z dowolnymi bazami danych, dzięki bibliotece ADO (Microsoft ActiveX Data Object XX Library). I od tych samych ponad 20 lat budzi to niezmiennie zdziwienie wśród moich klientów i studentów. Jak to? Excel może pobrać dane z Oracle?, SQL Servera? O! Może nawet je edytować?! No oczywiście, że może, i to od wielu lat…
Biblioteka ADO (w kodzie widoczna jako ADODB) jest domyślnie podłączana tylko w Accessie. We wszystkich innych produktach, w tym w Excelu trzeba ją wybrać w referencjach. Tools – References – Microsoft ActiveX Data Object XX Library, gdzie XX to numer wersji biblioteki, ja osobiście wybieram zwykle wersję 2.8
Drugi warunek to oczywiście poprawnie zainstalowany sterownik OLEDB do określonej bazy (http://en.wikipedia.org/wiki/OLE_DB_provider)
Poniżej przykład pobierający do Excela dane z Accessa 2003, ale uważny czytelnik zobaczy drogę pobierania z Accessa 2007/10/13/16/19 tudzież z SQL Servera. Wystarczy podmienić wartość właściwości ConnectionString obiektu Connection
Option Explicit Public Const WERSJA As String = "ADO Klient v.0.1" Public Const ARK_DANE As String = "Dane" Public Const ZRODLO As String = "tbBrutto" 'Załozenia: ' - mamy arkusz o nazwie "Dane" ' - mamy bazę PodstawyVBA.mdb a w niej tabelę tbBrutto ' - mamy sterownik do mdb 'Access mdb '========== Public Const CN_STR As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=D:\kursy\AC04\PodstawyVBA.mdb;" & _ "Persist Security Info=False" 'Ponizej przykłady konfiguracji dla innych baz 'Access accdb '============ 'Public Const CN_STR As String = _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=D:\kursy\AC04\PodstawyVBA.accdb;" & _ "Persist Security Info=False" 'SQL Server '========== 'Public Const CN_STR As String = _ "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _ "Persist Security Info=False;" & _ "Initial Catalog=Produkcyjna;" & _ "Data Source=SKARBEKMC\SQLEXPRESS" Sub OdczytDoExcela() Dim Zakres As Range Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset On Error GoTo Obsluga Sheets(ARK_DANE).Select Range("A1").Select Set Zakres = _ Sheets(ARK_DANE).Range("A1").CurrentRegion Zakres.ClearContents cn.ConnectionString = CN_STR cn.Open rs.Open ZRODLO, cn Sheets(ARK_DANE).Range("A2").CopyFromRecordset rs 'nagłówki Dim LK As Long, K As Long LK = rs.Fields.Count For K = 1 To LK Sheets(ARK_DANE).Cells(1, K) = rs.Fields(K - 1).Name Next Zakres.EntireColumn.AutoFit Czyszczenie: On Error Resume Next rs.Close Set rs = Nothing cn.Close Set cn = Nothing Exit Sub Obsluga: MsgBox Err.Number & " - " & Err.Description, vbExclamation, WERSJA Resume Czyszczenie End Sub |