VBA: CopyFromRecordset Example
Home Up Past Meetings Notes Tips Directory Links of Interest Site Map FAQs

A very fast means of taking an Access DAO recordset (it might work with ADO, too, I don't know) is to use the CopyFromRecordset method of an Excel Range Object. 

This is unbelievably hard to find in MS Excel VBA help. I never use the right keywords to find it. 

Thanks to Gordon Padwick (1996) Integrated Office Applications, p. 329. This book was my bible in regard to inter-application development.

Sub ExportFromProspectDB990630()
    Dim objAcc As Application
    Dim dbPros As Object
    Dim rsX1 As Object
    Dim rng1 As Range
    Dim sDBProspName As String
    Dim sQryName As String
    
    Dim oldStatusBar As Boolean
    oldStatusBar = Application.DisplayStatusBar
    Application.DisplayStatusBar = True
    
    sDBProspName = Range("X1A1DatabasePath")
    
    sQryName = "X1A1qryProsCurrentEssent"
    sQryName = Range("X1A1QueryName")
    
    'Set dbPros = opendatabase(sDBProspName)
    
    'from Padwick 96: Integrated Office Applications, p. 329
    Dim appDB As Application
    'Set appDB = CreateObject("access.application")
    On Error GoTo NoDB
    Application.StatusBar = "Opening Database: " & sDBProspName
    Set dbPros = OpenDatabase(sDBProspName)
    
    Application.StatusBar = "Reading Recordset..."
    Set rsX1 = dbPros.OpenRecordset(sQryName)
    
    Application.StatusBar = "Cleaning Spreadsheet..."
    With ActiveWorkbook.Sheets("X1A1qry")
        Set rng1 = .Range("X1A1UL")
        On Error Resume Next
        .Range("X1A1Area").Select
        If Err = 0 Then
            Selection.Clear
        End If
        .Range("X1A1UL").Select
        Selection.CurrentRegion.Select
        Selection.Clear
    End With
    On Error GoTo 0
    
    
    Application.StatusBar = "Writing Recordset to Spreadsheet..."
    Dim vaTmp() As String
    ReDim vaTmp(rsX1.Fields.Count)
    Dim ix As Integer
    For ix = 0 To rsX1.Fields.Count - 1
       vaTmp(ix) = rsX1.Fields(ix).Name
    Next
    rng1.Resize(1, rsX1.Fields.Count) = vaTmp
    
    Set rng1 = rng1.Offset(1, 0)
    
    rng1.CopyFromRecordset rsX1     'This is the magic right here!!!!
    rng1.CurrentRegion.Select
    
    ActiveWorkbook.Names.Add "X1A1Area", RefersTo:=rng1.CurrentRegion.Address
    Range("X1A1QueryTime") = Now
    
    Application.StatusBar = False
    Application.DisplayStatusBar = oldStatusBar
    Exit Sub
    
NoDB:
    MsgBox "Database Path failed to open.   Check DatabasePath"
    
End Sub

For questions or comments concerning content on this website: Stephen Rasey
Design of this site by Cheryl D. Wise
Copyright © 2000-2004 by WiserWays. All rights reserved.
Revised: 2005-07-10 01:09 .