Copyfromrecordset in excel vba

Skip to content

Effortlessly Manage Your Projects and Resources
120+ Professional Project Management Templates!

A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.

Save Up to 85% LIMITED TIME OFFER
Excel VBA Project Management Templates
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates

Excel Pack
50+ Excel PM Templates

PowerPoint Pack
50+ Excel PM Templates

MS Word Pack
25+ Word PM Templates

Ultimate Project Management Template

Ultimate Resource Management Template

Project Portfolio Management Templates
  • VBA CopyFromRecordset Range in Excel- Syntax
  • VBA CopyFromRecordset Range in Excel- Examples
    • VBA to Copy the 10 records from the Record Set – Example
    • VBA to Copy the 5 fields from the Record Set – Example

Page load link

Go to Top

title keywords f1_keywords ms.prod api_name ms.assetid ms.date ms.localizationpriority

Range.CopyFromRecordset method (Excel)

vbaxl10.chm144105

vbaxl10.chm144105

excel

Excel.Range.CopyFromRecordset

cec7fded-f4e0-1b1c-5374-8a860828c9cc

05/10/2019

medium

Range.CopyFromRecordset method (Excel)

Copies the contents of an ADO or DAO Recordset object onto a worksheet, beginning at the upper-left corner of the specified range. If the Recordset object contains fields with OLE objects in them, this method fails.

Syntax

expression.CopyFromRecordset (Data, MaxRows, MaxColumns)

expression A variable that represents a Range object.

Parameters

Name Required/Optional Data type Description
Data Required Variant The Recordset object to copy into the range.
MaxRows Optional Variant The maximum number of records to copy onto the worksheet. If this argument is omitted, all the records in the Recordset object are copied.
MaxColumns Optional Variant The maximum number of fields to copy onto the worksheet. If this argument is omitted, all the fields in the Recordset object are copied.

Return value

Long

Remarks

Copying begins at the current row of the Recordset object. After copying is completed, the EOF property of the Recordset object is True.

Example

This example copies the field names from a DAO Recordset object into the first row of a worksheet and formats the names as bold. The example then copies the recordset onto the worksheet, beginning at cell A2.

For iCols = 0 to rs.Fields.Count - 1 
 ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name 
Next 
ws.Range(ws.Cells(1, 1), _ 
 ws.Cells(1, rs.Fields.Count)).Font.Bold = True 
ws.Range("A2").CopyFromRecordset rs

[!includeSupport and feedback]

CopyFromRecordset Method

Copies the contents of an ADO or DAO Recordset object onto a worksheet, beginning at the upper-left corner of the specified range. If the Recordset object contains fields with OLE objects in them, this method fails.

expression.CopyFromRecordset(Data, MaxRows, MaxColumns)

expression   Required. An expression that returns a Range object.

Data   Required Variant. The Recordset object to copy into the range.

MaxRows   Optional Variant. The maximum number of records to copy onto the worksheet. If this argument is omitted, all the records in the Recordset object are copied.

MaxColumns   Optional Variant. The maximum number of fields to copy onto the worksheet. If this argument is omitted, all the fields in the Recordset object are copied.

Remarks

Copying begins at the current row of the Recordset object. After copying is completed, the EOF property of the Recordset object is True.

Example

This example copies the field names from a DAO Recordset object into the first row of a worksheet and formats the names as bold. The example then copies the recordset onto the worksheet, beginning at cell A2.

For iCols = 0 to rs.Fields.Count - 1
    ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1),  _
    ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rs

Всем привет! Материал сегодня будет посвящен рассмотрению возможности Access выгружать Recordset в Excel на VBA. Данный способ достаточно простой и предполагает использование Recordset как формы, так и специально созданного объекта.

Ранее мы с Вами уже рассматривали возможность выгрузки данных из Access в Excel в материале «Выгрузка данных из Access в шаблон Word и Excel», но там мы использовали специально созданный шаблон, что не совсем удобно, если например, нам необходимо выгрузить просто набор данных с заголовками полей.

Также если кого интересует, недавно мы рассматривали возможность выгрузки данных из базы MS SQL Server в формат CSV (текстовый файл с разделителями) с помощью VBA Access в материале «Экспорт данных в CSV файл из Microsoft SQL Server, используя Access 2003».

Сейчас я покажу простой пример реализации возможности выгружать наборы данных с заголовками из базы MS SQL Server средствами VBA Access в Excel.

Весь смысл сводится в использование метода CopyFromRecordset, который позволяет переносить Recordset в Excel в том виде, какой он и есть, т.е. в виде таблицы. Единственное что нам необходимо будет сделать, это выгрузить заголовки, чтобы было понятней, что за данные содержатся в той или иной колонке.

Итак, давайте приступать и для начала рассмотрим исходные данные.

Примечание! В качестве примера источником данных у меня будет выступать MS SQL Server 2012 Express, а в качестве клиента ADP проект Access 2003. Также на компьютере клиенте установлен Microsoft Office 2010.

Содержание

  1. Исходные данные
  2. Код VBA для выгрузки Recordset формы в Excel
  3. Код VBA для выгрузки объекта Recordset в Excel

Исходные данные

Допустим, на сервере у нас есть таблица TestTable.

Скриншот 1

Код SQL

 CREATE TABLE TestTable(
        ID INT IDENTITY(1,1) NOT NULL,
        ProductName VARCHAR(50) NOT NULL,
        Price MONEY NULL,
  CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED (ID ASC)
 )
 GO

И она содержит следующие данные.

Скриншот 2

Курс по SQL для начинающих

Код SQL

 SELECT * FROM TestTable

Также допустим, что в ADP проекте Access у нас есть форма, источником данных которой выступает наша тестовая таблица TestTable.

Сначала давайте рассмотрим пример выгрузки объекта Recordset формы в Excel. Для этого добавляем на форму кнопку, для примера я ее назвал RSExportInExcel. В обработку события нажатие кнопки вставляем следующий код, я его прокомментировал:

Скриншот 3

Код VBA

 Option Compare Database
 Private Sub RSExportInExcel_Click()
 On Error GoTo Err1
    'Переменные
    Dim XLApp As Object, XLBook As Object, XLSheet As Object, RS As ADODB.Recordset
    Dim CountColumn As Integer, WidthColumn As Integer
    'Создаем объекты: Excel, Книгу, Лист
    Set XLApp = CreateObject("Excel.Application")
    Set XLBook = XLApp.Workbooks.add
    Set XLSheet = XLBook.Worksheets(1)
    'Получаем Recordset формы
    Set RS = Me.Recordset
    'Узнаем количество колонок в Recordset
    CountColumn = RS.Fields.count
    'Циклом заполняем заголовки колонок
    For i = 0 To CountColumn - 1
        'Передвигаемся по колонкам в Excel путем смещения
        XLSheet.Range("A1").offset(0, i).value = RS.Fields(i).NAME
        'Немного подкорректируем внешний вид выгрузки
        'Ширину колонки определим динамически на основе длины поля, но не более 20 и не менее 6
        WidthColumn = Len(RS.Fields(i).NAME) + 2
        If WidthColumn > 20 Then
            WidthColumn = 20
        ElseIf WidthColumn < 6 Then
            WidthColumn = 10
        End If
        'Задаем для заголовка
        'Перенос по словам
        XLSheet.Rows(1).WrapText = True
        'Выравнивание
        XLSheet.Rows(1).HorizontalAlignment = xlCenter
        XLSheet.Rows(1).VerticalAlignment = xlCenter
        'Цвет фона
        XLSheet.Rows(1).Interior.ColorIndex = 15
        'Ширина
        XLSheet.Columns(i + 1).ColumnWidth = WidthColumn
    Next
    'Записываем Recordset в Excel
    XLSheet.Range("A2").CopyFromRecordset RS
    'Делаем видимым Excel
    XLApp.Visible = True
 Ex1:
    Exit Sub
 Err1:
    MsgBox Err.Description
    Resume Ex1
 End Sub

Сохраняем изменения и пробуем нажать на кнопку. В итоге у нас запустится Excel, а в нем будут необходимые нам данные.

Скриншот 4

Примечание! Свойства HorizontalAlignment и VerticalAlignment могут не работать, если на компьютере не установлен Microsoft Office 2010, поэтому в случае возникновения ошибок связанных с этими свойствами просто закомментируйте их.

Код VBA для выгрузки объекта Recordset в Excel

Теперь давайте напишем код, который позволяет выгружать объект Recordset, данные которого получены, скажем с помощью запроса к базе данных. Для этого добавьте еще одну кнопку (я ее назвал RSExportInExcel2) и вставьте немного модифицированный код:

Скриншот 5

Код VBA

 Private Sub RSExportInExcel2_Click()
 On Error GoTo Err1
    'Переменные
    Dim XLApp As Object, XLBook As Object, XLSheet As Object, RS As ADODB.Recordset
    Dim CountColumn As Integer, WidthColumn As Integer, StrSQLInExcel As String
    'Создаем объекты: Excel, Книгу, Лист
    Set XLApp = CreateObject("Excel.Application")
    Set XLBook = XLApp.Workbooks.add
    Set XLSheet = XLBook.Worksheets(1)
    'Создаем новый Recordset
    Set RS = New ADODB.Recordset
    'Текст запроса SQL, т.е. сюда можете вставить свой запрос, например, формировать его динамически
    StrSQLInExcel = "SELECT * FROM TestTable"
    'Получаем данные по текущему соединению
    RS.open StrSQLInExcel, CurrentProject.Connection
    'Узнаем количество колонок в Recordset
    CountColumn = RS.Fields.count
    'Циклом заполняем заголовки колонок
    For i = 0 To CountColumn - 1
        'Передвигаемся по колонкам в Excel путем смещения
        XLSheet.Range("A1").offset(0, i).value = RS.Fields(i).NAME
        'Немного подкорректируем внешний вид выгрузки
        'Ширину колонки определим динамически на основе длины поля, но не более 20 и не менее 6
        WidthColumn = Len(RS.Fields(i).NAME) + 2
        If WidthColumn > 20 Then
            WidthColumn = 20
        ElseIf WidthColumn < 6 Then
            WidthColumn = 10
        End If
        'Задаем для заголовка
        'Перенос по словам
        XLSheet.Rows(1).WrapText = True
        'Выравнивание
        XLSheet.Rows(1).HorizontalAlignment = xlCenter
        XLSheet.Rows(1).VerticalAlignment = xlCenter
        'Цвет фона
        XLSheet.Rows(1).Interior.ColorIndex = 15
        'Ширина
        XLSheet.Columns(i + 1).ColumnWidth = WidthColumn
    Next
    'Записываем Recordset в Excel
    XLSheet.Range("A2").CopyFromRecordset RS
    'Делаем видимым Excel
    XLApp.Visible = True
    'Закрываем Recordset
    RS.close
    Set RS = Nothing
 Ex1:
    Exit Sub
 Err1:
    MsgBox Err.Description
    Resume Ex1
 End Sub

Снова сохраняем и пробуем нажать на кнопку, в итоге у нас получится точно такая же выгрузка, как и чуть ранее, только сейчас в качестве источника данных Recordset у нас может выступать любой запрос, а не только данные формы.

На этом у меня все! Надеюсь, материал был Вам полезен, пока!

How to populate data from a recordset into a listobject?
The code below is not completely working:

oCN.ConnectionString = "DRIVER={SQL Server};Server=SRVSQL;Database=TEST;"
oCN.Open
Dim sqlString As String
sqlString = "SELECT * FROM MYTABLE"
oRS.Open sqlString, oCN

With Feuil3.ListObjects("TableArticles")
    If Not .DataBodyRange Is Nothing Then
        .DataBodyRange.Delete
    End If

    ' This make a 91 error
    Call .DataBodyRange.CopyFromRecordset(oRS)
    ' This copy data into sheet, not into listobject
    Call Feuil3.Range("A2").CopyFromRecordset(oRS)
End With

Community's user avatar

asked Jun 24, 2016 at 7:51

ebelair's user avatar

If you are always deleting the .DataBodyRange first, you can use the `.InsertRowRange’.

With Feuil3.ListObjects("TableArticles")
    If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
    .InsertRowRange.CopyFromRecordset(oRS)
End With

answered May 29, 2019 at 15:34

Gravitate's user avatar

GravitateGravitate

2,8652 gold badges20 silver badges36 bronze badges

Finally i found the solution.
Just resize the listobject to fit the content:

With Feuil3.ListObjects("TableArticles")
    If Not .DataBodyRange Is Nothing Then
        .DataBodyRange.Delete
    End If

    Call .Range(2, 1).CopyFromRecordset(oRS)
    Call .Resize(Feuil3.UsedRange)
End With

answered Jun 24, 2016 at 9:54

ebelair's user avatar

ebelairebelair

82411 silver badges27 bronze badges

Понравилась статья? Поделить с друзьями:
  • Copy worksheets in excel vba
  • Copy worksheet with excel vba
  • Copy words in excel
  • Copy words from pdf to word
  • Copy word text with formatting