Importuj dane z zamkniętego skoroszytu (ADO) za pomocą VBA w Microsoft Excel

Anonim

Jeśli chcesz zaimportować dużo danych z zamkniętego skoroszytu, możesz to zrobić za pomocą ADO i poniższego makra.
Jeśli chcesz pobrać dane z innego arkusza roboczego niż pierwszy arkusz w zamkniętym skoroszycie,
musisz odwołać się do zdefiniowanego przez użytkownika zakresu o nazwie. Poniższego makro można użyć w ten sposób (w programie Excel 2000 lub nowszym):

GetDataFromClosedWorkbook "C:\FolderName\WorkbookName.xls", "A1:B21", ActiveCell, False GetDataFromClosedWorkbook "C:\FolderName\WorkbookName.xls", "MyDataRange", Range ("B3"), True Sub GetDataFromClosedWorkbook(SourceFile As String, SourceRange As String, _ TargetRange As Range, IncludeFieldNames As Boolean) ' wymaga odwołania do biblioteki Microsoft ActiveX Data Objects ' jeśli SourceRange jest odwołaniem do zakresu: ' zwróci dane z pierwszego arkusza w SourceFile ' jeśli SourceRange jest odwołanie do zdefiniowanej nazwy: ' spowoduje to zwrócenie danych z dowolnego arkusza w SourceFile ' SourceRange musi zawierać nagłówki zakresu ' Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String Dim TargetCell As Range, i As Integer dbConnectionString = "DRIVER ={Sterownik Microsoft Excel (*.xls)};" & _ "ReadOnly=1;DBQ=" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString ' otwórz połączenie z bazą danych Set rs = dbConnection.Execute("[" & SourceRange & "]") Ustaw TargetCell = TargetRange.Cells(1, 1) If IncludeFieldNames Then For i = 0 To rs.Fields.Count - 1 TargetCell.Offset(0, i).Formula = rs.Fields(i).Name Next i Ustaw TargetCell = TargetCell .Offset(1, 0) End If TargetCell.CopyFromRecordset rs rs.Close dbConnection.Close 'zamyka połączenie z bazą danych Set TargetCell = Nic Set rs = Nic nie ustawia dbConnection = Nic przy błędzie GoTo 0 Exit Sub InvalidInput: MsgBox "Plik źródłowy lub zakres źródłowy jest nieprawidłowy!", _ vbExclamation, "Pobierz dane z zamkniętego skoroszytu" End Sub

Inna metoda, która nie korzysta z metody CopyFromRecordSet Za pomocą poniższego makra możesz wykonać import i mieć lepszą kontrolę nad wynikami zwracanymi z zestawu rekordów.

Sub TestReadDataFromWorkbook() ' wypełnia dane z zamkniętego skoroszytu w aktywnej komórce Dim tArray As Variant, r As Long, c As Long tArray = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "A1:B21") ' bez transpozycji ' For r = LBound(tArray, 2) To UBound(tArray, 2) ' For c = LBound(tArray, 1) To UBound(tArray, 1) ' ActiveCell.Offset(r, c).Formula = tArray( c, r) ' Następny c ' Następny r ' z transpozycją tArray = Application.WorksheetFunction.Transpose(tArray) For r = LBound(tArray, 1) To UBound(tArray, 1) For c = LBound(tArray, 2) To UBound (tArray, 2) ActiveCell.Offset(r - 1, c - 1).Formula = tArray(r, c) Next c Next r End Sub Private Function ReadDataFromWorkbook(SourceFile As String, SourceRange As String) As Variant ' wymaga odwołania do biblioteki Microsoft ActiveX Data Objects ' jeśli SourceRange jest odniesieniem do zakresu: ' ta funkcja może zwrócić dane tylko z pierwszego arkusza w SourceFile ' jeśli SourceRange jest zdefiniowaną nazwą odniesienia: ' ta funkcja może zwrócić dane z m każdy arkusz w SourceFile ' SourceRange musi zawierać przykłady ' nagłówków zakresu: ' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "A1:A21") ' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceW xls", "A1:B21") ' varRecordSetData = ReadDataFromWorkbook("C:\FolderName\SourceWbName.xls", "DefinedRangeName") Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String dbRionConnectString = {Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString ' otwórz połączenie z bazą danych Set rs = dbConnection.Execute("[" & SourceRange & "]") On Error GoTo 0 ReadDataFromWorkbook = rs.GetRows ' zwraca tablicę dwóch dim ze wszystkimi rekordami w rs rs.Close dbConnection.Close ' zamyka połączenie z bazą danych Set rs = Nothing Set dbConnection = Nothing On Error GoTo 0 Exit Function InvalidInput: MsgBox "Plik źródłowy lub zakres źródłowy jest nieprawidłowy!", vbExclamation, "Pobierz dane z zamkniętego skoroszytu" Set rs = Nic Ustaw dbConnection = Nic Koniec funkcji

W przykładzie makra założono, że projekt VBA dodał odwołanie do biblioteki obiektów ADO.
Możesz to zrobić z poziomu VBE, wybierając menu Narzędzia, Referencje i wybierając Microsoft
ActiveX Data Objects x.x Biblioteka obiektów.
Użyj ADO, jeśli możesz wybrać między ADO i DAO do importu lub eksportu danych.