MyTetra Share
Делитесь знаниями!
Способы передачи данных из Visual Basic в Excel
Время создания: 10.10.2019 09:59
Текстовые метки: vba_excel
Раздел: !Закладки - VBA - Excel
Запись: xintrea/mytetra_db_adgaver_new/master/base/15706907646xqzxbi41a/text.html на raw.githubusercontent.com


Способы передачи данных из Visual Basic в Excel

Применимо к: Microsoft Office Excel 2007Microsoft Office Excel 2003Excel 2010

Аннотация

В данной статье рассматриваются способы передачи данных в Microsoft Excel из приложения Microsoft Visual Basic. В статье также представлены преимущества и недостатки каждого из способов, что позволяет пользователю выбрать наиболее подходящий способ для конкретной ситуации.

Дополнительная информация

Чаще всего для передачи данных в книгу Excel используется программирование объектов (автоматизация). Этот способ обладает наибольшим спектром возможностей для указания местоположения данных в книге Excel, а также обеспечивает возможность форматирования книги и настройки различных параметров во время выполнения. Программирование объектов позволяет использовать для передачи данных несколько подходов:


Передача данных по одной ячейке

Передача массива данных в диапазон ячеек

Передача набора записей ADO в диапазон ячеек с помощью способа CopyFromRecordset

Создание в листе Excel объекта QueryTable, содержащего результаты запроса по источнику данных ODBC или OLEDB

Передача данных в буфер обмена с последующей вставкой содержимого буфера обмена в лист Excel


Также существуют способы передачи данных в Excel, не требующие программирования объектов. При работе с серверным приложением рекомендуется освободить клиентов от большого объема обрабатываемых данных. Ниже приведены способы передачи данных, не использующие программирование объектов.


Передача данных в текстовый файл, использующий запятые или знаки табуляции в качестве разделителей, который Excel впоследствии может разобрать на ячейки листа

Передача данных на лист Excel с помощью ADO

Передача данных в Excel с помощью динамического обмена данными (DDE)


В следующих разделах приведены дополнительные сведения о каждом решении.


Примечание. При использовании Microsoft Office Excel 2007 для сохранения книги Excel 2007 можно использовать новый формат файла (XSLX). Для этого найдите следующую строку кода в приведенных ниже примерах:


oBook.SaveAs "C:\Book1.xls"


Замените этот код следующей строкой кода:


oBook.SaveAs "C:\Book1.xlsx"


Кроме того, база данных «Борей» не входит в состав Office 2007 по умолчанию. Вы можете скачать базу данных «Борей» из Microsoft Office Online.

Для передачи данных между ячейкой используйте службу автоматизации.

С помощью службы автоматизации вы сможете передавать данные на лист по одной ячейке за раз:


Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object


'Start a new workbook in Excel

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add


'Add data to cells of the first worksheet in the new workbook

Set oSheet = oBook.Worksheets(1)

oSheet.Range("A1").Value = "Last Name"

oSheet.Range("B1").Value = "First Name"

oSheet.Range("A1:B1").Font.Bold = True

oSheet.Range("A2").Value = "Doe"

oSheet.Range("B2").Value = "John"


'Save the Workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit


Передача данных по одной ячейке является оптимальным способом передачи небольших объемов данных. Этот способ позволяет помещать данные в любом месте рабочей книги и форматировать ячейки во время выполнения. Однако этот способ не рекомендуется применять при передаче больших объемов данных в книгу Excel. Каждый объект Range, получаемый во время выполнения, вызывает запрос к интерфейсу, поэтому такой способ передачи данных может оказаться очень медленным. Кроме того, в Microsoft Windows 95 и Windows 98 существует ограничение на запросы к интерфейсу, составляющее 64 КБ. При превышении лимита в 64 КБ сервер автоматизации (Excel) может перестать отвечать на запросы или может отображаться сообщение о нехватке памяти.


Таким образом, передача данных по одной ячейке допустима только для небольших объемов данных. Для передачи больших объемов данных в Excel следует использовать один из способов, описанных ниже.


Примеры сценариев для автоматизации Excel см. в следующей статье базы знаний Майкрософт:

219151 Как использовать Visual Basic для автоматизации Microsoft Excel

Использование автоматизации для передачи массива данных на диапазон на листе

Массив данных может передаваться одновременно на диапазон из нескольких ячеек:


Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object


'Start a new workbook in Excel

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add


'Create an array with 3 columns and 100 rows

Dim DataArray(1 To 100, 1 To 3) As Variant

Dim r As Integer

For r = 1 To 100

DataArray(r, 1) = "ORD" & Format(r, "0000")

DataArray(r, 2) = Rnd() * 1000

DataArray(r, 3) = DataArray(r, 2) * 0.7

Next


'Add headers to the worksheet on row 1

Set oSheet = oBook.Worksheets(1)

oSheet.Range("A1:C1").Value = Array("Order ID", "Amount", "Tax")


'Transfer the array to the worksheet starting at cell A2

oSheet.Range("A2").Resize(100, 3).Value = DataArray

'Save the Workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit


Передача большого объема данных с помощью массива происходит значительно быстрее, чем передача данных по одной ячейке. Обратите внимание на строку из приведенного выше сценария, которая одновременно передает данные в 300 ячеек листа:


oSheet.Range("A2").Resize(100, 3).Value = DataArray


Эта строка представляет всего два запроса к интерфейсу (один для объекта Range, возвращаемого методом Range, и один для объекта Range, возвращаемого методом Resize). При этом при передаче данных по одной ячейке потребовалось бы 300 запросов к интерфейсу для объектов Range. Поэтому передачу данных необходимо по возможности осуществлять с помощью массива, чтобы сократить число запросов к интерфейсу.

Передача набора записей ADO с помощью программирования объектов

В Excel 2000 появился метод CopyFromRecordset, позволяющий передавать наборы данных ADO (или DAO) в диапазон ячеек листа. Приведенный ниже сценарий является примером автоматизации Excel 2000, Excel 2002 или Office Excel 2003 для переноса содержимого таблицы Orders образца базы данных «Борей» с помощью метода CopyFromRecordset.


'Create a Recordset from all the records in the Orders table

Dim sNWind As String

Dim conn As New ADODB.Connection

Dim rs As ADODB.Recordset

sNWind = _

"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";"

conn.CursorLocation = adUseClient

Set rs = conn.Execute("Orders", , adCmdTable)

'Create a new workbook in Excel

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add

Set oSheet = oBook.Worksheets(1)

'Transfer the data to Excel

oSheet.Range("A1").CopyFromRecordset rs

'Save the Workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit

'Close the connection

rs.Close

conn.Close


Примечание. При использовании версии базы данных «Борей» для Office 2007 необходимо заменить в примере следующую строку кода:


conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ sNWind & ";"


Замените эту строку кода следующей строкой:


conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ sNWind & ";"


В Excel 97 также имеется метод CopyFromRecordset, однако его можно использовать только для набора записей DAO. CopyFromRecordset в Excel 97 не поддерживает ADO.


Дополнительные сведения об использовании ADO и метода CopyFromRecordset см. в следующей статье базы знаний Майкрософт:

246335 Как передавать данные из набора записей ADO в Excel средствами автоматизации

Использование автоматизации для создания объекта QueryTable на листе

Объект QueryTable представляет собой таблицу, созданную на основании данных, возвращенных из внешнего источника данных. При автоматизации Microsoft Excel для создания объекта QueryTable следует просто указать строку подключения к источнику данных OLEDB или ODBC в строке SQL. Далее Excel генерирует набор записей и вставляет его в указанное местоположение на листе. Использование объекта QueryTables обладает несколькими преимуществами по сравнению с использованием метода CopyFromRecordset:


Созданием набора записей и его размещением на листе управляет Excel.

Запрос можно сохранить в объекте QueryTable таким образом, чтобы в дальнейшем его можно было обновить и получить обновленный набор записей.

При добавлении нового объекта QueryTable к листу можно переместить данные, уже находящиеся в ячейках листа, чтобы свободно разместить новые данные (см. свойство RefreshStyle).


Ниже приводится пример сценария, позволяющего автоматизировать Excel 2000, Excel 2002 или Office Excel 2003 для создания нового объекта QueryTable на листе Excel с данными из образца базы данных «Борей».


'Create a new workbook in Excel

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add

Set oSheet = oBook.Worksheets(1)

'Create the QueryTable

Dim sNWind As String

sNWind = _

"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"

Dim oQryTable As Object

Set oQryTable = oSheet.QueryTables.Add( _

"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";", oSheet.Range("A1"), "Select * from Orders")

oQryTable.RefreshStyle = xlInsertEntireRows

oQryTable.Refresh False

'Save the Workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit


Использование буфера обмена

Буфер обмена Windows также может использоваться как механизм передачи данных на лист Excel. Чтобы вставить данные в несколько ячеек листа, можно скопировать строку, в которой столбцы разделены знаками табуляции, а строки – символами возврата каретки. В приведенном ниже сценарии показано, как Visual Basic может использовать буфер обмена для передачи данных в Excel:


'Copy a string to the clipboard

Dim sData As String

sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _

& "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _

& "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"

Clipboard.Clear


Clipboard.SetText sData

'Create a new workbook in Excel

Dim oExcel As Object

Dim oBook As Object

Set oExcel = CreateObject("Excel.Application")

Set oBook = oExcel.Workbooks.Add


'Paste the data

oBook.Worksheets(1).Range("A1").Select

oBook.Worksheets(1).Paste

'Save the Workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls"

oExcel.Quit


Создание текстового файла с разделителями, который Excel может разобрать по строкам и столбцам

Excel может открывать файлы с разделителями – знаками табуляции и запятыми – и правильно распределять данные по ячейкам. Этим можно воспользоваться при необходимости передачи большого объема данных в лист Excel с минимальным использованием автоматизации. Этот подход рекомендуется для приложений типа клиент-сервер, поскольку текстовый файл может генерироваться серверным приложением. Затем текстовый файл можно открыть с помощью клиентского приложения, при необходимости используя автоматизацию.


Ниже приведен сценарий, иллюстрирующий создание текстового файла с разделителями-запятыми из набора записей ADO:


'Create a Recordset from all the records in the Orders table

Dim sNWind As String

Dim conn As New ADODB.Connection

Dim rs As ADODB.Recordset

Dim sData As String

sNWind = _

"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";"

conn.CursorLocation = adUseClient

Set rs = conn.Execute("Orders", , adCmdTable)

'Save the recordset as a tab-delimited file

sData = rs.GetString(adClipString, , vbTab, vbCr, vbNullString)

Open "C:\Test.txt" For Output As #1

Print #1, sData

Close #1

'Close the connection

rs.Close

conn.Close

'Open the new text file in Excel

Shell "C:\Program Files\Microsoft Office\Office\Excel.exe " & _

Chr(34) & "C:\Test.txt" & Chr(34), vbMaximizedFocus


Примечание. При использовании версии базы данных «Борей» для Office 2007 необходимо заменить в примере следующую строку кода:


conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _

sNWind & ";"


Замените эту строку кода следующей строкой:


conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _

sNWind & ";"


Если файл имеет расширение CSV, Excel открывает его без отображения мастера импорта текста и по умолчанию принимает, что в файле используются разделители-запятые. Если же файл имеет расширение TXT, Excel автоматически разбирает его, используя в качестве разделителей знаки табуляции.


В приведенном выше примере запуск Excel осуществлялся с помощью оператора Shell, а имя файла использовалось как аргумент командной строки. А в этом примере автоматизация не использовалась. Однако при желании можно применить минимум автоматизации, чтобы открыть текстовый файл и сохранить его в формате книги Excel:


'Create a new instance of Excel

Dim oExcel As Object

Dim oBook As Object

Dim oSheet As Object

Set oExcel = CreateObject("Excel.Application")

'Open the text file

Set oBook = oExcel.Workbooks.Open("C:\Test.txt")

'Save as Excel workbook and Quit Excel

oBook.SaveAs "C:\Book1.xls", xlWorkbookNormal

oExcel.Quit


Передача данных на лист Excel с помощью ADO

С помощью Microsoft Jet OLE DB Provider можно добавлять записи в таблицу существующей книги Excel. «Таблицей» в Excel считается диапазон с заданным именем. Первая строка диапазона содержит заголовки (или имена полей), а все последующие строки – записи. Ниже приведен пример пошагового создания книги с пустой таблицей

MyTable.

Excel 97, Excel 2000 и Excel 2003


Откройте новую книгу Excel.

Добавьте следующие заголовки в ячейки A1:B1 листа 1:


A1: FirstName B1: LastName

Выровняйте ячейку B1 по правому краю.

Выделите диапазон A1:B1.

В меню Вставка выберите пункт Имя, а затем выберите команду Присвоить. Введите имя MyTable и нажмите кнопку ОК.

Сохраните новую книгу как C:\Book1.xls и закройте Excel.


Чтобы добавить записи в таблицу MyTable с помощью ADO, можно воспользоваться примерно следующим сценарием:


'Create a new connection object for Book1.xls

Dim conn As New ADODB.Connection

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:\Book1.xls;Extended Properties=Excel 8.0;"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Bill', 'Brown')"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Joe', 'Thomas')"

conn.Close


Excel 2007


В Excel 2007 создайте книгу.

Добавьте следующие заголовки в ячейки A1:B1 листа 1:


A1: FirstName B1: LastName

Выровняйте ячейку B1 по правому краю.

Выделите диапазон A1:B1.

На ленте откройте вкладку Формулы и выберите элемент Присвоить имя. Введите имя MyTable и нажмите кнопку ОК.

Сохраните новую книгу как C:\Book1.xlsx и закройте Excel.


Чтобы добавить записи в таблицу MyTable с помощью ADO, используйте код, подобный приведенному ниже.


'Create a new connection object for Book1.xls

Dim conn As New ADODB.Connection

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _

"Data Source=C:\Book1.xlsx;Extended Properties=Excel 12.0;"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Scott', 'Brown')"

conn.Execute "Insert into MyTable (FirstName, LastName)" & _

" values ('Jane', 'Dow')"

conn.Close


При подобном добавлении записей в таблицу форматирование книги сохраняется. В приведенном выше примере новые поля, добавляемые в столбец B, выравниваются по правому краю. Каждая запись, добавляемая в строку, форматируется так же, как предыдущая.


Обратите внимание на то, что при добавлении в ячейку или ячейки листа запись заменяет любые данные, находившиеся в этих ячейках ранее; другими словами, строки листа не сдвигаются вниз при добавлении новых записей. Это следует иметь в виду при планировании размещения данных на листе.


Примечание. Обновление данных на листе Excel с помощью ADO или DAO невозможно в среде Visual Basic for Application в Access после установки пакета обновлений 2 (SP2) для Office 2003 или обновления для Access 2002, описанного в статье 904018 базы знаний Майкрософт. Однако этот способ можно использовать в среде Visual Basic for Application в других приложениях Office, то есть в Word, Excel и Outlook.

Для получения дополнительной информации щелкните приведенные ниже номера статей базы знаний Майкрософт:

904953 Невозможно вносить изменения, добавлять или удалять данные в таблицах, источником которых являются книги Excel в Office Access 2003 или в Access 2002

904018 Описание обновления для Access 2002: от 18 октября 2005 г.


Дополнительные сведения об использовании ADO для доступа к книгам Excel см. в следующих статьях базы знаний Майкрософт:

195951 Как создать запросы и выполнить обновление данных Excel с помощью ADO со страниц ASP

Использование DDE для передачи данных в Excel

Наряду с программированием объектов, DDE является еще одним способом связи с Excel и передачи данных. Однако, в противоположность программированию объектов и COM, DDE больше не является предпочтительным способом связи с другими приложениями и должен использоваться только при отсутствии других решений.


Для передачи данных в Excel с помощью DDE можно воспользоваться одним из следующих способов:


Используйте метод LinkPoke для вставки данных в указанный диапазон ячейки (ячеек)


-или-

Используйте метод LinkExecute для отправки команд, которые будет выполнять Excel.


В приведенном ниже примере показано, как установить связь DDE с Excel таким образом, чтобы можно было поместить данные в ячейки листа и выполнить команды. В этом примере для успешного установления связи DDE с файлом LinkTopic Excel|MyBook.xls книга с именем MyBook.xls

уже должна быть открыта в запущенном экземпляре Excel.


Примечание. При использовании Excel 2007 для сохранения книг можно использовать новый формат файла (XLSX). Обязательно обновите имя файла в приведенном ниже примере кода.


Примечание. В данном примере Text1 представляет элемент управления Text Box формы Visual Basic:


'Initiate a DDE communication with Excel

Text1.LinkMode = 0

Text1.LinkTopic = "Excel|MyBook.xls"

Text1.LinkItem = "R1C1:R2C3"

Text1.LinkMode = 1

'Poke the text in Text1 to the R1C1:R2C3 in MyBook.xls

Text1.Text = "one" & vbTab & "two" & vbTab & "three" & vbCr & _

"four" & vbTab & "five" & vbTab & "six"

Text1.LinkPoke

'Execute commands to select cell A1 (same as R1C1) and change the font

'format

Text1.LinkExecute "[SELECT(""R1C1"")]"

Text1.LinkExecute "[FONT.PROPERTIES(""Times New Roman"",""Bold"",10)]"

'Terminate the DDE communication

Text1.LinkMode = 0


При использовании метода LinkPoke с Excel необходимо указать диапазон в формате строка-столбец (R1C1) для LinkItem. Если данные вставляются в несколько ячеек, можно использовать строку, в которой столбцы разделены символами табуляции, а строки – символами возврата каретки.


Если метод LinkExecute используется для выполнения команды в Excel, синтаксис команды должен соответствовать языку Excel Macro Language (XLM). Документация по XLM не входит в состав Excel 97 и более поздних версий.


DDE не является рекомендуемым способом связи с Excel. Программирование объектов предоставляет больше возможностей и обеспечивает лучший доступ к новым функциям Excel.

Ссылки

Для получения дополнительной информации щелкните приведенный ниже номер статьи базы знаний Майкрософт:

306022 Как выполнить перенос данных в книгу Excel с помощью Visual Basic .NET

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования