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
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.
Содержание
- Исходные данные
- Код VBA для выгрузки Recordset формы в Excel
- Код VBA для выгрузки объекта Recordset в Excel
Исходные данные
Допустим, на сервере у нас есть таблица TestTable.
Код 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
И она содержит следующие данные.
Код SQL
SELECT * FROM TestTable
Также допустим, что в ADP проекте Access у нас есть форма, источником данных которой выступает наша тестовая таблица TestTable.
Сначала давайте рассмотрим пример выгрузки объекта Recordset формы в Excel. Для этого добавляем на форму кнопку, для примера я ее назвал RSExportInExcel. В обработку события нажатие кнопки вставляем следующий код, я его прокомментировал:
Код 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, а в нем будут необходимые нам данные.
Примечание! Свойства HorizontalAlignment и VerticalAlignment могут не работать, если на компьютере не установлен Microsoft Office 2010, поэтому в случае возникновения ошибок связанных с этими свойствами просто закомментируйте их.
Код VBA для выгрузки объекта Recordset в Excel
Теперь давайте напишем код, который позволяет выгружать объект Recordset, данные которого получены, скажем с помощью запроса к базе данных. Для этого добавьте еще одну кнопку (я ее назвал RSExportInExcel2) и вставьте немного модифицированный код:
Код 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
asked Jun 24, 2016 at 7:51
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
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
ebelairebelair
82411 silver badges27 bronze badges