Bruk en lukket arbeidsbok som en database (DAO) ved hjelp av VBA i Microsoft Excel

Anonim

Med prosedyrene nedenfor kan du bruke DAO til å hente et rekordsett fra en lukket arbeidsbok og lese/skrive data.
Ring prosedyren slik:
GetWorksheetData "C: \ Foldername \ Filename.xls", "SELECT * FROM [SheetName $]", ThisWorkbook.Worksheets (1) .Range ("A3")
Erstatt Arknavn med regnearknavnet du vil hente data fra.

Sub GetWorksheetData (strSourceFile As String, strSQL As String, TargetCell As Range) Dim db As DAO.Database, rs As DAO.Recordset, f As Integer, r Så lenge TargetCell ikke er noe Avslutt Sub On Error Resume Next Set db = OpenDatabase (strSourceFile, False, True, "Excel 8.0; HDR = Yes;") 'read only' Sett db = OpenDatabase (strSourceFile, False, False, "Excel 8.0; HDR = Yes;") 'write' Sett db = OpenDatabase ( "C: \ Foldername \ Filename.xls", False, True, _ "Excel 8.0; HDR = Yes;") 'read only' Set db = OpenDatabase ("C: \ Foldername \ Filename.xls", False, False, _ "Excel 8.0; HDR = Ja;") 'skriv på feil GoTo 0 Hvis db ikke er noe, kan MsgBox "Kan ikke finne filen!", VbExclamation, ThisWorkbook.Name Avslutt Sub End Hvis' 'liste regnearksnavn' For f = 0 To db.TableDefs.Count - 1 'Debug.Print db.TableDefs (f) .Name' Next f 'open a recordset On Error Resume Next Set rs = db.OpenRecordset (strSQL)' Set rs = db.OpenRecordset ( "SELECT * FROM [SheetName $]") 'Sett rs = db.OpenRecordset ("SELECT * FROM [SheetName $]" & _ "WHERE [Field Name] LIKE 'A*'") 'Set rs = db.OpenRecordset ("SELECT*FROM [SheetName $]" & _ "WHERE [Field Name] LIKE' A*'ORDER BY [Field Name]" ) Ved feil GoTo 0 Hvis rs er ingenting, så kan MsgBox "Kan ikke åpne filen!", VbExclamation, ThisWorkbook.Name db.Close Set db = Nothing Exit Sub End If RS2WS rs, TargetCell rs.Close Set rs = Nothing db. Lukk Set db = Nothing End Sub Sub RS2WS (rs As DAO.Recordset, TargetCell As Range) Dim f As Integer, r As Long, c As Long If rs Nothing Nothing Exit Sub If TargetCell Is Nothing Then Exit Sub With Application .Calculation = xlCalculationManual .ScreenUpdating = False .StatusBar = "Skriver data fra rekordsett …" Avslutt med TargetCell.Cells (1, 1) r = .Rad c = .Kolonne Slutt med Med TargetCell.Parent .Range (.Cells (r, c) ), .Cells (.Rows.Count, c + rs.Fields.Count - 1)). Fjern "slett eksisterende innhold" skrive kolonneoverskrifter For f = 0 Til rs.Fields.Count - 1 Ved feil Gjenoppta neste. Celler ( r, c + f) .Formula = rs.Fields (f) .Name På Feil Gå til 0 Neste f 'skrive rec ord Om feil Gjenoppta neste rs.MoveFirst På feil GoTo 0 Do While Not rs.EOF r = r + 1 For f = 0 To rs.Fields.Count - 1 On Error Resume Next .Cells (r, c + f) .Formula = rs.Fields (f) .Value On Error GoTo 0 Next f rs.MoveNext Loop .Rows (TargetCell.Cells (1, 1) .Row) .Font.Bold = True .Columns ("A: IV"). AutoFit Slutt med applikasjonen .StatusBar = Falsk .Calculation = xlCalculationAutomatic .ScreenUpdating = True End With End Sub

Makroeksemplene forutsetter at VBA -prosjektet ditt har lagt til en referanse til DAO -objektbiblioteket.
Du kan gjøre dette fra VBE ved å velge menyen Verktøy, referanser og velge Microsoft DAO x.xx objektbibliotek.