|
|||||||
Способы переноса данных в Excel из Visual Basic
Время создания: 12.10.2019 20:12
Раздел: Разные закладки - VBA - Excel - Range
Запись: xintrea/mytetra_db_adgaver_new/master/base/1570876162sd5t6ohqf2/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
Способы переноса данных в Excel из Visual Basic
Excel 2010, Office Excel 2007, Office Excel 2003 В этой статье рассказывается о многочисленных способах переноса данных в Microsoft Excel из приложения Microsoft Visual Basic. В этой статье также представлены преимущества и недостатки каждого метода, чтобы вы могли выбрать решение, которое лучше всего подходит для вас. Наиболее распространенный подход, используемый для передачи данных в книгу Excel, — Автоматизация. Автоматизация предоставляет максимальную гибкость для указания расположения данных в книге, а также возможность форматирования книги и создания различных параметров во время выполнения. С помощью автоматизации вы можете использовать несколько подходов для переноса данных:
Кроме того, существуют методы, которые можно использовать для передачи данных в Excel, которые не требуют автоматизации. Если вы используете приложение на стороне сервера, это может быть хорошим подходом для массового обработки данных от клиентов. Для переноса данных без автоматизации можно использовать следующие методы:
В следующих разделах приводятся более подробные сведения о каждом из этих решений. Note (Примечание ) При использовании Microsoft Office Excel 2007 вы можете использовать новый формат файла книги Excel 2007 (XLSX) при сохранении книг. Для этого откройте следующую строку кода в следующих примерах кода: oBook.SaveAs "C:\Book1.xls" Замените этот код следующей строкой кода: oBook.SaveAs "C:\Book1.xlsx" Кроме того, база данных "Борей" по умолчанию не включена в Office 2007. Тем не менее, вы можете скачать базу данных Northwind из 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 требуется большой объем данных. Каждый объект диапазона, полученный во время выполнения, вызывает запрос интерфейса таким образом, что передача данных таким способом может замедлиться. Кроме того, Microsoft Windows 95 и Windows 98 имеют ограничение на 64 КБ для запросов интерфейса. Если вы достигли предельного значения 64 КБ на запросах интерфейса, сервер автоматизации (Excel) может перестать отвечать на запросы или могут возникать ошибки, указывающие на нехватку памяти. Как раз, передача данных по ячейке допускается только для небольших объемов данных. Если вам нужно перенести большие наборы данных в Excel, следует рассмотреть одно из решений, представленных ниже. Дополнительные примеры кода для автоматизации Excel приведены в статье Автоматизация Microsoft Excel в Visual Basic . Использование автоматизации для переноса массива данных в диапазон листа Массив данных можно переносить в диапазон нескольких ячеек одновременно: 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 появился метод Копифромрекордсет, позволяющий перенести набор записей ADO (или DAO) в диапазон на листе. В приведенном ниже коде показано, как можно автоматизировать Excel 2000, Excel 2002 или Office Excel 2003 и перенести содержимое таблицы Orders в образце базы данных Northwind с помощью метода Копифромрекордсет. '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 Note (Примечание ) Если вы используете версию Office 2007 для базы данных Northwind, необходимо заменить следующую строку кода в примере кода: conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ sNWind & ";" Замените эту строку кода следующей строкой кода: conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ sNWind & ";" Excel 97 также предоставляет метод Копифромрекордсет, но его можно использовать только с набором записей DAO. Копифромрекордсет с Excel 97 не поддерживает ADO. Для получения дополнительных сведений об использовании ADO и методе Копифромрекордсет обратитесь к следующей статье базы знаний Майкрософт: 246335 как перенести данные из набора записей ADO в Excel с помощью автоматизации Использование автоматизации для создания QueryTable на листе Объект QueryTable представляет таблицу, созданную на основе данных, возвращенных из внешнего источника данных. При автоматизации Microsoft Excel можно создать QueryTable, просто предоставив строку подключения к OLEDB или источнику данных ODBC, а также строку SQL. Excel предполагает ответственность за создание набора записей и вставку его на лист в указанном расположении. Использование QueryTables предоставляет ряд преимуществ по сравнению с методом Копифромрекордсет:
В приведенном ниже коде показано, как можно автоматизировать Excel 2000, Excel 2002 или Office Excel 2003, чтобы создать новый QueryTable на листе Excel с помощью данных из учебной базы данных Northwind: '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 также можно использовать в качестве механизма передачи данных на лист. Чтобы вставить данные в несколько ячеек листа, можно скопировать строку, в которой столбцы разделяются символами табуляции, а строки — символами возврата каретки. В приведенном ниже коде показано, как Visual Basic может использовать объект Clipboard для передачи данных в 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 может открывать файлы с разделителями табуляцией и запятыми и правильно анализировать данные в ячейки. Вы можете использовать эту функцию, если вы хотите перенести большой объем данных на лист, используя практически любую автоматизацию. Это может быть хорошим подходом к приложению "клиент-сервер", так как текстовый файл может быть создан на стороне сервера. Затем можно открыть текстовый файл на клиенте, используя автоматизацию там, где это необходимо. В приведенном ниже коде показано, как создать текстовый файл с разделителями запятыми из набора записей 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 для базы данных Northwind, необходимо заменить следующую строку кода в примере кода: 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 Передача данных на лист с помощью ADO С помощью поставщика OLE DB для Microsoft Jet можно добавлять записи в таблицу в существующей книге Excel. "Таблица" в Excel — это просто диапазон с определенным именем. Первая строка диапазона должна содержать заголовки (или имена полей), а все последующие строки содержат записи. В следующей процедуре показано, как создать книгу с пустой таблицей с именем MyTable. Excel 97, Excel 2000 и Excel 2003
A1: имя B1: LastName Чтобы добавить записи в 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
A1: имя B1: LastName Чтобы добавить записи в таблицу 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 для среды приложений в Access после установки пакета обновления 2 (SP2) для Office 2003 или после установки обновления для Access 2002, включенного в микропрограммы Статья базы знаний Майкрософт 904018. Этот метод хорошо работает в Visual Basic для приложений в среде приложений из других приложений Office, таких как Word, Excel и Outlook. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт: 904953 невозможно изменить, добавить или удалить данные в таблицах, связанных с книгой Excel в Office Access 2003 или в Access 2002 Дополнительную информацию об использовании ADO для доступа к книге Excel можно узнать, как запрашивать и обновлять данные Excel с помощью ADO из ASP . Использование DDE для передачи данных в Excel DDE является альтернативой автоматизации для связи с Excel и передачи данных; Однако с появлением автоматизации и COM-интерфейс DDE больше не является предпочтительным методом связи с другими приложениями и его следует использовать только в том случае, если вы не можете использовать другие решения. Для передачи данных в Excel с помощью DDE можно использовать метод Линкпоке для обмена данными с определенным диапазоном ячеек или с помощью метода Линкексекуте для отправки команд, которые будут выполняться приложением Excel. В приведенном ниже примере кода показано, как установить сеанс DDE с Excel, чтобы можно было выполнять ввод данных в ячейки листа и выполнять команды. С помощью этого примера можно успешно установить сеанс DDE в Линктопик Excel | Мибук. xls книга с именем Мибук. xls должна быть уже открыта в запущенном экземпляре Excel. Примечание При использовании Excel 2007 можно сохранить книги, используя новый формат файла XLSX. Убедитесь, что вы обновляете имя файла в приведенном ниже примере кода. Note (Примечание ) В этом примере Текст1 представляет элемент управления "текстовое поле" в форме 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 При использовании Линкпоке с Excel необходимо указать диапазон в нотации Row-Column (R1C1) для Линкитем. При Покинг данных к нескольким ячейкам можно использовать строку, в которой столбцы разделяются символами табуляции, а строки — символами возврата каретки. При использовании Линкексекуте для выполнения команды в Excel необходимо дать команду в виде синтаксиса в формате макросов Excel (XLM). Документация по XLM не входит в состав Excel версий 97 и более поздних версий. DDE не является рекомендуемым решением для связи с Excel. Автоматизация обеспечивает максимальную гибкость и предоставляет вам дополнительный доступ к новым функциям, которые предлагает Excel. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|