Visual basic запись в excel

This VBA Program reads an Excel Range (Sales Data) and write to a Text file (Sales.txt)

Excel VBA code to read data from an Excel file (Sales Data – Range “A1:E26”).  Need two “For loop” for rows and columns. Write each value with a comma in the text file till the end of columns (write without comma only the last column value). Do the above step until reach the end of rows. 

Sales Data in Excel: 5 columns and 25 rows

Sales Data

VBA code to create a text file as below

VBA Code:

  • Declaring Variables :  
Variable Data Type Comments
myFileName  String Output text file (Full path with file name)
rng Range Excel range to read 
cellVal Variant Variable to assign each cell value
row Integer Iterate rows
col Integer Iterate columns
'Variable declarations
Dim myFileName As String, rng As Range, cellVal As Variant, row As Integer, col As Integer
  • Initialize variables:
    • myFileName: The file name with the full path of the output text file
    • rng: Excel range to read data from an excel.
'Full path of the text file
myFileName = "D:ExcelWriteTextsales.txt"
'Data range need to write on text file
Set rng = ActiveSheet.Range("A1:E26")

Open the output text file and assign a variable “#1”

'Open text file
Open myFileName For Output As #1

‘Nested loop to iterate both rows and columns of a given range eg: “A1:E26” [5 columns and 26 rows]

'Number of Rows
For row = 1 To rng.Rows.Count
   'Number of Columns
   For col = 1 To rng.Columns.Count

Assign the value to variable cellVal 

cellVal = rng.Cells(row, col).Value

Write cellVal with comma.  If the col is equal to the last column of a row.  write-only value without the comma.

'write cellVal on text file
    If col = rng.Columns.Count Then
        Write #1, cellVal 
    Else
        Write #1, cellVal, 
    End If

Close both for loops

   Next col
Next row

Close the file

Close #1

Approach:

Step 1: Add a shape (Create Text File) to your worksheet 

Step 2: Right-click on “Create a Text file” and “Assign Macro..”

Step 3: Select MacroToCreateTextFile

Step 4: Save your excel file as “Excel Macro-Enabled Workbook”  *.xlsm

Step 5: Click “Create Text file

Студворк — интернет-сервис помощи студентам

Еще по теме:
1. Тема: Выгрузка с форматированием: задать диапазон выгружаемых данных
2. Тема: Пример записи / чтения с Microsoft Excel в VB

Способы передачи данных с Visual Basic в Excel
Источник: MSDN

В данной статье рассматриваются способы передачи данных в 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). Для этого найдите следующую строку кода в приведенных ниже примерах:

Visual Basic

oBook.SaveAs "C:Book1.xls"

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

Visual Basic

oBook.SaveAs "C:Book1.xlsx"

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

Перенос данных по одной ячейке с помощью автоматизации

Автоматизация позволяет передавать данные на лист Excel по одной ячейке:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   Dim oExcel As Object
   Dim oBook As Object
   Dim oSheet As Object
 
   'Открыть новую книгу Excel
   Set oExcel = CreateObject("Excel.Application")
   Set oBook = oExcel.Workbooks.Add
 
   'Добавить данные в ячейки первого листа новой книги
   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"
 
   'Сохранить книгу и закрыть Excel
   oBook.SaveAs "C:Book1.xls"
   oExcel.Quit

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

216400 Автоматизация COM может привести к зависанию клиентского приложения в Win 95/98 (Эта ссылка может указывать на содержимое полностью или частично на английском языке).

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

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

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

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   Dim oExcel As Object
   Dim oBook As Object
   Dim oSheet As Object
 
   'Открыть новую книгу Excel
   Set oExcel = CreateObject("Excel.Application")
   Set oBook = oExcel.Workbooks.Add
 
   'Создать массив с 3 столбцами и 100 строками
   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
 
   'Добавить заголовки в строку 1
   Set oSheet = oBook.Worksheets(1)
   oSheet.Range("A1:C1").Value = Array("Order ID", "Amount", "Tax")
 
   'Передать массив на лист, начиная с ячейки A2
   oSheet.Range("A2").Resize(100, 3).Value = DataArray
   
   'Сохранить книгу и закрыть Excel
   oBook.SaveAs "C:Book1.xls"
   oExcel.Quit

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

Visual Basic

   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.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   'Создать набор записей из всех записей таблицы Orders
   Dim sNWind As String
   Dim conn As New ADODB.Connection
   Dim rs As ADODB.Recordset
   sNWind = _
      "C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb"
   conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
      sNWind & ";"
   conn.CursorLocation = adUseClient
   Set rs = conn.Execute("Orders", , adCmdTable)
   
   'Создать новую книгу 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)
   
   'Передать данные в Excel
   oSheet.Range("A1").CopyFromRecordset rs
   
   'Сохранить книгу и закрыть Excel
   oBook.SaveAs "C:Book1.xls"
   oExcel.Quit
   
   'Разорвать соединение
   rs.Close
   conn.Close

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

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

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

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

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

Дополнительные сведения об использовании ADO и метода CopyFromRecordset см. в следующей статье базы знаний Майкрософт:
246335 Использование программирования объектов для передачи данных из набора записей в 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 с данными из базы Northwind:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   'Создать новую книгу 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)
   
   'Создать объект QueryTable
   Dim sNWind As String
   sNWind = _
      "C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.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
   
   'Сохранить книгу и закрыть Excel
   oBook.SaveAs "C:Book1.xls"
   oExcel.Quit

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

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   'Скопировать строку в буфер обмена
   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
   
   'Создать новую книгу Excel
   Dim oExcel As Object
   Dim oBook As Object
   Set oExcel = CreateObject("Excel.Application")
   Set oBook = oExcel.Workbooks.Add
   
 
   'Вставить данные
   oBook.Worksheets(1).Range("A1").Select
   oBook.Worksheets(1).Paste
   
   'Сохранить книгу и закрыть Excel
   oBook.SaveAs "C:Book1.xls"
   oExcel.Quit

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

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

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   'Создать набор записей из всех записей таблицы Orders
   Dim sNWind As String
   Dim conn As New ADODB.Connection
   Dim rs As ADODB.Recordset
   Dim sData As String
   sNWind = _
      "C:Program FilesMicrosoft OfficeOfficeSamplesNorthwind.mdb"
   conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
      sNWind & ";"
   conn.CursorLocation = adUseClient
   Set rs = conn.Execute("Orders", , adCmdTable)
   
   'Сохранить набор записей как файл с символами табуляции в качестве разделителей
   sData = rs.GetString(adClipString, , vbTab, vbCr, vbNullString)
   Open "C:Test.txt" For Output As #1
   Print #1, sData
   Close #1
    
   'Разорвать соединение
   rs.Close
   conn.Close
   
   'Открыть новый текстовый файл в Excel
   Shell "C:Program FilesMicrosoft OfficeOfficeExcel.exe " & _
      Chr(34) & "C:Test.txt" & Chr(34), vbMaximizedFocus

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

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

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

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

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

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
   'Создать новый экземпляр Excel
   Dim oExcel As Object
   Dim oBook As Object
   Dim oSheet As Object
   Set oExcel = CreateObject("Excel.Application")
       
   'Открыть текстовый файл
   Set oBook = oExcel.Workbooks.Open("C:Test.txt")
   
   'Сохранить книгу Excel и закрыть Excel
   oBook.SaveAs "C:Book1.xls", xlWorkbookNormal
   oExcel.Quit

Дополнительные сведения об операциях ввода-вывода файлов из приложения Visual Basic см. в следующей статье базы знаний Майкрософт:
172267 RECEDIT.VBP демонстрирует ввод-вывод файлов в Visual Basic recedit.rar
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)

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

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

Excel 97, Excel 2000 и Excel 2003

1. Откройте новую книгу Excel.
2. Добавьте следующие заголовки в ячейки A1:B1 листа Sheet1:
A1: FirstName B1: LastName
3. Выровняйте ячейку B1 по правому краю.
4. Выделите A1:B1.
5. В меню Вставка выберите Имя, а затем Присвоить. Введите имя MyTable и нажмите кнопку OK.
6. Сохраните новую книгу как C:Book1.xls и закройте Excel.

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

Visual Basic
1
2
3
4
5
6
7
8
9
   'Создать новый объект подключения для 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

1. В Excel 2007 создайте книгу.
2. Добавьте следующие заголовки в ячейки A1:B1 листа «Лист1»:
A1: FirstName B1: LastName
3. Выровняйте ячейку B1 по правому краю.
4. Выделите диапазон A1:B1.
5. На ленте откройте вкладку Формулы и выберите пункт Определить имя. Введите имя MyTable и нажмите кнопку ОК.
6. Сохраните новую книгу как C:Book1.xlsx и закройте Excel.

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

Visual Basic
1
2
3
4
5
6
7
8
9
   'Создание объекта соединения для 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
904018 Описание обновления для Access 2002: от 18 октября 2005 г.

Дополнительные сведения об использовании ADO для доступа к книгам Excel см. в следующих статьях базы знаний Майкрософт:
195951 Создание запросов и обновление данных Excel с помощью ADO со страниц ASP
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)

Передача данных в Excel с помощью DDE

Наряду с программированием объектов 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:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   'Установить связь DDE с Excel
   Text1.LinkMode = 0
   Text1.LinkTopic = "Excel|MyBook.xls"
   Text1.LinkItem = "R1C1:R2C3"
   Text1.LinkMode = 1
   
   'Вставить текст из Text1 в ячейки R1C1:R2C3 файла MyBook.xls
   Text1.Text = "one" & vbTab & "two" & vbTab & "three" & vbCr & _
                "four" & vbTab & "five" & vbTab & "six"
   Text1.LinkPoke
   
   'Выполнить следующие команды – выбрать ячейку A1 (R1C1) и изменить шрифт
   'format
   Text1.LinkExecute "[SELECT(""R1C1"")]"
   Text1.LinkExecute "[FONT.PROPERTIES(""Times New Roman"",""Bold"",10)]"
   
   'Разорвать связь DDE
   Text1.LinkMode = 0

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

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

143466 Файл Macro97.exe доступен для загрузки. macro97.rar
(Эта ссылка может указывать на содержимое полностью или частично на английском языке)

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

Все ссылки MSDN по теме:
Автоматизация COM может привести к зависанию клиентского приложения в Win 95/98
Использование Visual Basic для автоматизации Microsoft Excel
Использование программирования объектов для передачи данных из набора записей в Excel
RECEDIT.VBP демонстрирует ввод-вывод файлов в Visual Basic
Запрещается вносить изменения, добавлять или удалять данные, источником которых являются книги Excel в Office Access 2003 или в Access 2002
Описание обновления для Access 2002: от 18 октября 2005 г.
Создание запросов и обновление данных Excel с помощью ADO со страниц ASP (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
Документация по XLM

Способы передачи данных из 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 FilesMicrosoft OfficeOfficeSamplesNorthwind.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 FilesMicrosoft OfficeOfficeSamplesNorthwind.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 FilesMicrosoft OfficeOfficeSamplesNorthwind.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 FilesMicrosoft OfficeOfficeExcel.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

Чтение и запись в файл, открытый с помощью оператора Open. Операторы Input, Line Input, Write и функция EOF. Примеры использования в VBA Excel.

Операторы чтения и записи в файл

Оператор Input #

Оператор Input # считывает данные из открытого файла с последовательным доступом и присваивает эти данные переменным.

Оператор Input # используется только с файлами, открытыми в режиме Input или Binary. При прочтении стандартные строковые или числовые значения присваиваются переменным без изменения.

Синтаксис оператора Input #:

Input #Номер_файла, Переменные

Компоненты оператора Input #:

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Переменные – обязательный параметр, представляющий из себя список переменных, разделенных запятой, которым присваиваются значения, считанные из файла.

Особенности применения оператора Input #:

  • Элементы данных в файле должны быть указаны в том же порядке, что и переменные в списке Переменные, и соответствовать им по типу данных. Если переменная числовая, а данные текстовые, этой переменной будет присвоено нулевое значение.
  • Если при чтении данных достигнут конец файла, чтение прерывается и возникает ошибка. Для ее предупреждения в коде VBA Excel используется функция EOF.
  • Чтобы данные из файла могли быть правильно прочитаны и записаны в переменные с помощью оператора Input #, они должны быть записаны в файл с помощью оператора Write #. Он обеспечивает правильное разделение каждого из полей (элементов) данных.

Оператор Line Input #

Оператор Line Input # считывает одну строку из открытого файла с последовательным доступом и присваивает ее значение строковой переменной.

Оператор Line Input # считывает из файла по одному символу до тех пор, пока не встретится символ возврата каретки (Chr(13)) или последовательность символа возврата каретки и перевода строки (Chr (13) + Chr(10)).

Синтаксис оператора Line Input #:

Line Input #Номер_файла, Переменная

Компоненты оператора Line Input #:

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Переменная – обязательный параметр, представляющий из себя имя переменной, объявленной как String или Variant, которой присваивается строка, считанная из файла.

Оператор Write #

Оператор Write # записывает данные в файл с последовательным доступом.

Синтаксис оператора Write #:

Write #Номер_файла, [Данные]

Компоненты оператора Write #:

  • Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
  • Данные – необязательный параметр, представляющий из себя одно или несколько числовых или строковых выражений, разделенных запятой, которые нужно записать в файл.

Особенности применения оператора Write #:

  • Данные, записанные с помощью оператора Write #, считываются из файла с помощью оператора Input #.
  • Если опустить параметр Данные и добавить запятую после Номер_файла, в файл будет добавлена пустая строка.
  • Несколько выражений в списке Данные могут быть разделены точкой с запятой или запятой.
  • Числовые данные всегда записываются с точкой в качестве разделителя целой и дробной части.
  • Оператор Write # вставляет запятые между элементами и прямые парные кавычки вокруг строк при их записи в файл.
  • После записи в файл последнего символа из параметра Данные оператор Write # вставляет символы возврата каретки и перевода строки (Chr (13) + Chr(10)).

Функция EOF

Функция EOF возвращает логическое значение True, когда достигнут конец файла, открытого для последовательного (Input) или произвольного (Random) доступа.

Синтаксис функции EOF:

Номер_файла – это номер, присвоенный файлу при открытии с помощью оператора Open.

Функция EOF используется для предупреждения ошибок, вызываемых попытками выполнить чтение после конца файла. Она возвращает значение False, пока не будет достигнут конец файла.

Примеры чтения и записи в файл

Пример 1
Открытие (или создание, если он не существует) текстового файла для чтения и записи и запись в него одной строки, состоящей из двух текстовых и одного числового значений. Файл с именем myFile1.txt будет создан в той же папке, где расположен файл Excel с кодом VBA.

Sub Test1()

Dim ff As Integer

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем (или создаем) файл для чтения и записи

Open ThisWorkbook.Path & «myFile1.txt» For Output As ff

‘Записываем в файл одну строку

Write #ff, «Дает корова молоко!», _

«Куда идет король?», 25.35847

‘Закрываем файл

Close ff

‘Открываем файл для просмотра

ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile1.txt»)

End Sub

Строки и число можно предварительно присвоить переменным, объявленным с соответствующими типами данных, и использовать их для записи данных в файл (в строках кода с оператором Write #, как в этом и следующем примерах).

Пример 2
Открытие (или создание, если он не существует) файла без расширения для чтения и записи и запись в него трех строк: двух текстовых и одной в числовом формате. Файл с именем myFile2 будет создан в той же папке, где расположен файл Excel с кодом VBA.

Так как у файла нет расширения, Windows выведет диалоговое окно для выбора открывающей его программы. Выберите любой текстовый редактор или интернет-браузер.

Sub Test2()

Dim ff As Integer

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем (или создаем) файл для чтения и записи

Open ThisWorkbook.Path & «myFile2» For Output As ff

‘Записываем в файл три строки

Write #ff, «Дает корова молоко!»

Write #ff, «Куда идет король?»

Write #ff, 25.35847

‘Закрываем файл

Close ff

‘Открываем файл для просмотра

ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile2»)

End Sub

Пример 3
Считываем строку, разделенную на отдельные элементы, из файла myFile1.txt и записываем в три переменные, по типу данных соответствующие элементам.

Sub Test3()

Dim ff As Integer, str1 As String, _

str2 As String, num1 As Single

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile1.txt для чтения

Open ThisWorkbook.Path & «myFile1.txt» For Input As ff

‘Считываем строку из файла и записываем в переменные

Input #ff, str1, str2, num1

Close ff

‘Смотрим, что записалось в переменные

MsgBox «str1 = « & str1 & vbNewLine _

& «str2 = « & str2 & vbNewLine _

& «num1 = « & num1

End Sub

Попробуйте заменить в этом примере строку Input #ff, str1, str2, num1 сначала на строку Input #ff, str1, затем на строку Line Input #ff, str1, чтобы наглядно увидеть разницу между операторами Input # и Line Input #.

В следующих примерах (4 и 5) замена оператора Input # на Line Input # не приведет ни к каким изменениям, так как данные в строках файла myFile2 не разделены на элементы (поля).

Пример 4
Считываем поочередно три строки из файла myFile2 и записываем в три элемента массива, объявленного как Variant, так как в этот файл ранее были записаны две строки с текстом и одна с числом.

Sub Test4()

Dim ff As Integer, a(2) As Variant, i As Byte

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile2 для чтения

Open ThisWorkbook.Path & «myFile2» For Input As ff

‘Считываем строки из файла и записываем в элементы массива

   For i = 0 To 2

      Input #ff, a(i)

   Next

Close ff

‘Смотрим, что записалось в элементы массива

MsgBox «a(0) = « & a(0) & vbNewLine _

& «a(1) = « & a(1) & vbNewLine _

& «a(2) = « & a(2)

End Sub

Пример 5
Считываем с помощью цикла Do While… Loop все строки из файла myFile2 и записываем построчно в переменную, объявленную как String (число из третьей строки запишется как текст). Для остановки цикла при достижении конца файла используем функцию EOF.

Sub Test5()

Dim ff As Integer, a As Variant, b As String

‘Получаем свободный номер для открываемого файла

ff = FreeFile

‘Открываем файл myFile2 для чтения

Open ThisWorkbook.Path & «myFile2» For Input As ff

‘Считываем строки из файла и записываем в элементы массива

   Do While Not EOF(ff)

      Input #ff, a

      b = b & a & vbNewLine

   Loop

Close ff

‘Смотрим, что записалось в переменную

MsgBox b

End Sub


Предыдущая часть темы об открытии файла для ввода и вывода информации опубликована в статье: Оператор Open (синтаксис, параметры). Смотрите также связанную статью: Функция FreeFile.

Смотрите, как создавать и открывать текстовые файлы с помощью методов CreateTextFile и OpenTextFile. Чтение файла, запись и добавление информации с помощью объекта TextStream.


Excel VBA Запись текстового файла

В VBA мы можем открыть, прочитать или записать текстовый файл. Запись текстового файла означает, что данные у нас есть на листе Excel, и мы хотим, чтобы это был текстовый файл или файл блокнота. Поэтому есть два метода: свойство FileSystemObject VBA и метод Open and Write в VBA.

В большинстве корпоративных компаний после завершения отчета они стараются загрузить отчет в базу данных. Они используют формат «текстовые файлы» для обновления базы данных для загрузки в базу данных. Обычно мы копируем данные из Excel и вставляем их в текстовый файл. Мы полагаемся на текстовые файлы, потому что с ними очень легко работать из-за их легкости и простоты. Используя кодирование VBAИспользование кодирования VBAКод VBA представляет собой набор инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи. Подробнее, мы можем автоматизировать задачу копирования данных из файл Excel в текстовый файл. В этой статье показано, как копировать или записывать данные из файла Excel в текстовый файл с помощью кода VBA.

Оглавление

  • Excel VBA Запись текстового файла
    • Как записать данные в текстовые файлы с помощью VBA?
      • Синтаксис открытого текстового файла
      • Пример №1
        • Шаг 1: Объявить переменную
        • Шаг 2: Определите номер файла
        • Шаг 3: Назначьте путь к файлу
        • Шаг 4: Назначьте бесплатную функцию файла
        • Шаг 5: Откройте текстовый файл
        • Шаг 6: Используйте метод печати/записи
        • Шаг 7: Сохраните и закройте текстовый файл
      • Пример #2
    • Рекомендуемые статьи

Текстовый файл записи VBA

Как записать данные в текстовые файлы с помощью VBA?

Запись данных из Excel в текст сложна и требует очень хороших знаний кодирования VBA. Выполните следующие шаги, чтобы написать код VBA для копирования dataWrite Код VBA для копирования DataFile Copy — это встроенная функция VBA, которая используется для копирования файла из одного места в другое. Чтобы использовать эту функцию, мы должны указать текущий путь к файлу, а также путь к файлу назначения. читать больше из Excel в текстовый файл.

Прежде чем мы покажем вам, как писать код, позвольте мне объяснить, как открыть текстовый файл с помощью оператора open.

Синтаксис открытого текстового файла

Открыть [File Path]Для [Mode]Как [File Number]

Путь к файлу: Путь к файлу, который мы пытаемся открыть на компьютере.

Режим: Режим — это контроль, который мы можем иметь при открытии текстовых файлов. У нас может быть три типа контроля над текстовым файлом.

  • Режим ввода: Это предполагает управление открывающимся текстовым файлом только для чтения. Если мы используем «Режим ввода», мы ничего не можем сделать с файлом. Вместо этого мы можем просто прочитать содержимое текстового файла.
  • Режим вывода: Мы можем написать содержание на этой опции. Мы должны помнить, что он перезапишет все существующие данные. Итак, мы должны опасаться возможной потери старых данных.
  • Режим добавления: Этот режим полностью противоположен Выходной режим. Используя этот метод, мы можем записать новые данные в конец существующих данных в файле.

Номер дела: Это подсчитает количество текстовых файлов всех открытых текстовых файлов. Он распознает открытые номера файлов в виде целых чисел от 1 до 511. Однако присвоение номера файла сложно и приводит к путанице. Для этого мы можем использовать бесплатную функцию File.

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

.free_excel_div{фон:#d9d9d9;размер шрифта:16px;радиус границы:7px;позиция:относительная;margin:30px;padding:25px 25px 25px 45px}.free_excel_div:before{content:»»;фон:url(центр центр без повтора #207245;ширина:70px;высота:70px;позиция:абсолютная;верх:50%;margin-top:-35px;слева:-35px;граница:5px сплошная #fff;граница-радиус:50%} Вы можете скачать этот шаблон текстового файла записи VBA здесь — Шаблон текстового файла записи VBA

Пример №1

Выполните следующие шаги, чтобы написать код для создания нового текстового файла.

Предположим, у вас уже есть текстовый файл с именем «Hello.txt» в памяти вашего компьютера, и мы покажем вам, как записать в него данные.

Шаг 1: Объявить переменную

Объявите переменную для хранения пути к файлу как строку.

Код:

Sub TextFile_Example1 () Dim Path As String End Sub

Пример записи текста VBA 1-1Шаг 2: Определите номер файла

Чтобы определить, на какой номер файла мы ссылаемся, объявите еще одну переменную как IntegerVariable. Поскольку IntegerIn VBA целое число — это тип данных, который может быть присвоен любой переменной и использоваться для хранения целочисленных значений. В VBA скобка для максимального числа целочисленных переменных, которые можно сохранить, аналогична скобке в других языках. Используя оператор DIM, любую переменную можно определить как целочисленную переменную.Подробнее.

Код:

Sub TextFile_Example1() Dim Path As String Dim FileNumber As Integer End Sub

Пример записи текста VBA 1-2Шаг 3: Назначьте путь к файлу

Теперь назначьте путь к файлу с именем для переменной Path.

Код:

Sub TextFile_Example1() Dim Path As String Dim FileNumber As Integer Path = «D:Excel FilesVBA FileHello.txt» ‘Измените путь в соответствии с вашими требованиями End Sub

Пример записи текста VBA 1-3Шаг 4: Назначьте бесплатную функцию файла

Теперь назначьте функцию «Свободный файл» для хранения уникальных номеров файлов для переменной «Номер файла».

Код:

Sub TextFile_Example1() Dim Path As String Dim FileNumber As Integer Path = «D:Excel FilesVBA FileHello.txt» ‘Измените путь в соответствии с вашими требованиями FileNumber = FreeFile End Sub

Пример записи текста VBA 1-4Шаг 5: Откройте текстовый файл

Теперь нам нужно открыть текстовый файл, чтобы работать с ним. Как мы объяснили, нам нужно использовать оператор OPEN, чтобы открыть текстовый файл.

Пример 1-5
Шаг 6: Используйте метод печати/записи

Как только файл откроется, нам нужно что-то в нем написать. Нам нужен метод «Запись» или «Печать» для записи в текстовый файл.

Код:

Sub TextFile_Example1() Dim Path As String Dim FileNumber As Integer Path = «D:Excel FilesVBA FileHello.txt» ‘Измените путь в соответствии с вашими требованиями FileNumber = FreeFile Open Path For Output As FileNumber Print #FileNumber, «Welcome» Print #FileNumber , «to» Print #FileNumber, «VBA» End Sub

Пример 1-6

Во-первых, нам нужно указать номер файла (здесь мы присвоили файлу переменную «FileNumber»), затем нам нужно добавить содержимое, которое мы хотим добавить в текстовый файл.

Шаг 7: Сохраните и закройте текстовый файл

Как только мы запишем содержимое в текстовый файл, нам нужно сохранить и закрыть текстовый файл.

Код:

Sub TextFile_Example1() Dim Path As String Dim FileNumber As Integer Path = «D:Excel FilesVBA FileHello.txt» ‘Измените путь в соответствии с вашими требованиями FileNumber = FreeFile Open Path For Output As FileNumber Print #FileNumber, «Welcome» Print #FileNumber , «to» Print #FileNumber, «VBA» Close FileNumber End Sub

Пример 1-7

Теперь запустите код вручную или с помощью сочетания клавиш Excel. Ярлык Excel. Ярлык Excel — это метод выполнения ручного задания более быстрым способом. Подробнее F5. Он запишет указанный контент в указанный текстовый файл.

Пример записи текста VBA 1-8Пример #2

Теперь мы увидим, как записать данные листа Excel в текстовый файл.

Для этого примера мы создали простые данные в Excel, как показано ниже.

Пример записи текста VBA 1

Шаг 1: Продолжая старый пример, определите еще две переменные как Integer, чтобы найти последнюю строку и последний столбец.

Код:

Sub TextFile_Example2() Dim Path As String Dim FileNumber As Integer Dim LR As Integer Dim LC As Integer End Sub

Пример записи текста VBA 2

Шаг 2: Найдите последнюю использованную строку и столбец на листе.

Пример записи текста VBA 2-1

Шаг 3: Теперь назначьте путь к файлу и номер файла.

Пример записи текста VBA 2-2

Шаг 4: Используйте оператор OPEN, чтобы открыть текстовый файл.

Пример записи текста VBA 2-3

Шаг 5: Нам нужно перебирать строки и столбцы, поэтому объявите еще две переменные как Integer.

Пример записи текста VBA 2-4

Шаг 6: Теперь откройте цикл, чтобы перебрать строку (для следующего цикла в VBAFor Next Loop В VBAВсе языки программирования используют цикл For Next в VBA. После оператора FOR в этом цикле есть критерий, и код повторяется до тех пор, пока не критерии достигнуты. читать дальше)

Пример записи текста VBA 2-5

Шаг 7: Чтобы выполнить цикл по столбцам, откройте еще один цикл внутри существующего цикла.

Пример записи текста VBA 2-6

Шаг 8: Нам нужно писать одну и ту же строку данных, пока она не достигнет последнего столбца. Поэтому для этого примените оператор IF в VBA.

Пример 2-7

Шаг 9: Теперь сохраните и закройте текстовый файл.

Пример 2-8

Этот код запишет данные в текстовый файл, но чтобы открыть текстовый файл после записи, нам нужно использовать приведенный ниже код.

Пример 2-9

Код:

Sub TextFile_Example2() Dim Path As String Dim FileNumber As Integer Dim LR As Integer Dim LC As Integer Dim k As Integer Dim i As Integer LR = Worksheets(«Text»).Cells(Rows.Count, 1).End(xlUp) .Row LC = Рабочие листы («Текст»). Ячейки (1, Столбцы. Количество). Конец (xlToLeft). Путь к столбцу = «D: Excel FilesVBA FileHello.txt» FileNumber = FreeFile Открытый путь для вывода в виде FileNumber For k = 1 В LR Для i = 1 В LC Если i <> LC Затем напечатать #FileNumber, Cells(i, k), иначе Напечатать #FileNumber, Cells(i, k) End If Next i Next k Закрыть FileNumber Shell «notepad.exe » & Путь, vbNormalFocus End Sub

Итак, запускаем код с помощью клавиши F5 или вручную. Затем он скопирует данные ниже.

Пример записи текста VBA 2-10

Рекомендуемые статьи

Эта статья представляет собой руководство по записи текстового файла VBA. Здесь мы узнаем, как копировать/записывать данные с рабочего листа в текстовый файл с практическими примерами и загружаемым шаблоном. Ниже вы можете найти несколько полезных статей по Excel VBA:

  • VBA Подождите
  • Диалоговое окно файла VBA
  • Функция InStr VBA

Like this post? Please share to your friends:
  • Vlookup excel как по русски
  • Vlookup excel in russian
  • Vlookup excel how to use
  • Vlookup and vlookup excel на русском
  • Vlookup and vba excel