Importer data fra en lukket projektmappe (ADO) ved hjælp af VBA i Microsoft Excel

Anonim

Hvis du vil importere mange data fra en lukket projektmappe, kan du gøre dette med ADO og makroen herunder.
Hvis du vil hente data fra et andet regneark end det første regneark i den lukkede projektmappe,
du skal henvise til et brugerdefineret navngivet område. Makroen herunder kan bruges på denne måde (i Excel 2000 eller nyere):

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) 'kræver en reference til Microsoft ActiveX Data Objects -biblioteket', hvis SourceRange er en områdereference: 'dette returnerer data fra det første regneark i SourceFile', hvis SourceRange er en defineret navnerefference: 'dette returnerer data fra ethvert regneark i SourceFile' SourceRange skal indeholde områdeoverskrifterne 'Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String Dim TargetCell As Range, i As Integer dbConnectionString = "DRIVER = {Microsoft Excel Driver (*.xls)}; " & _ "ReadOnly = 1; DBQ =" & SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString 'åbn databaseforbindelsen Sæt rs = dbConnection.Execute ("[" & SourceRange & "]") Set 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 Set TargetCell = TargetCell .Offset (1, 0) End If TargetCell.CopyFromRecordset rs rs.Close dbConnection.Close 'luk databaseforbindelsen Set TargetCell = Nothing Set rs = Nothing Set dbConnection = Nothing On Error GoTo 0 Exit Sub InvalidInput: MsgBox "Kildefilen eller kildeområde er ugyldigt! ", _ vbExclamation," Hent data fra lukket projektmappe "Afslut Sub

En anden metode, der ikke bruger CopyFromRecordSet-metoden Med makroen herunder kan du udføre importen og have bedre kontrol over de resultater, der returneres fra RecordSet.

Sub TestReadDataFromWorkbook () 'udfylder data fra en lukket projektmappe i den aktive celle Dim tArray As Variant, r As Long, c As Long tArray = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName.xls", "A1: B21")' uden at transponere 'For r = LBound (tArray, 2) Til UBound (tArray, 2)' For c = LBound (tArray, 1) Til UBound (tArray, 1) 'ActiveCell.Offset (r, c) .Formel = tArray ( c, r) 'Næste c' Næste r 'med transponering af tArray = Application.WorksheetFunction.Transpose (tArray) For r = LBound (tArray, 1) Til UBound (tArray, 1) For c = LBound (tArray, 2) Til UBound (tArray, 2) ActiveCell.Offset (r - 1, c - 1) .Formula = tArray (r, c) Næste c Næste r Afslut Sub Private Function ReadDataFromWorkbook (SourceFile As String, SourceRange As String) As Variant 'kræver en reference til Microsoft ActiveX Data Objects -biblioteket 'hvis SourceRange er en områdereference:' denne funktion kan kun returnere data fra det første regneark i SourceFile ', hvis SourceRange er en defineret navnerefference:' denne funktion kan returnere data fra m ethvert regneark i SourceFile 'SourceRange skal indeholde rækkeviddeoverskrifternes eksempler:' varRecordSetData = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName.xls", "A1: A21") 'varRecordSetData = ReadDataFromWorkbook ("C: \ FolderName \ SourceWbName. xls "," A1: B21 ") 'varRecordSetData = ReadDataFromWorkbook (" C: \ FolderName \ SourceWbName.xls "," DefinedRangeName ") Dim dbConnection As ADODB.Connection, rs As ADODB.Recordset Dim dbConnectionString As String dbConnection {Microsoft Excel Driver (*.xls)}; ReadOnly = 1; DBQ = "& SourceFile Set dbConnection = New ADODB.Connection On Error GoTo InvalidInput dbConnection.Open dbConnectionString 'open the database connection Set rs = dbConnection.Execute (" [" & SourceRange & "]") Ved fejl GoTo 0 ReadDataFromWorkbook = rs.GetRows 'returnerer et todæmpet array med alle poster i rs rs.Luk dbConnection.Close' luk databaseforbindelsen Sæt rs = Intet Indstil dbConnection = Intet ved fejl GoTo 0 Afslut funktion InvalidInput: MsgBox "Kildefilen eller kildeområde er ugyldigt! ", vbExclamation," Hent data fra lukket projektmappe "Indstil rs = Intet Indstil dbConnection = Intet Afslut funktion

Makroeksemplet antager, at dit VBA -projekt har tilføjet en reference til ADO -objektbiblioteket.
Du kan gøre dette inde fra VBE ved at vælge menuen Værktøjer, Referencer og vælge Microsoft
ActiveX Data Objects x.x Object Library.
Brug ADO, hvis du kan vælge mellem ADO og DAO til dataimport eller eksport.