Перейти к содержимому

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

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

  1. Операторы чтения и записи в файл
  2. Функция EOF
  3. Примеры чтения и записи в файл

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

Оператор 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:

EOF (Номер_файла)

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

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

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

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

Sub Test1()
Dim ff As Integer, ws As Object
'Получаем свободный номер для открываемого файла
ff = FreeFile
'Открываем (или создаем) файл для чтения и записи
Open ThisWorkbook.Path & "\myFile1.txt" For Output As ff
'Записываем в файл одну строку
Write #ff, "Дает корова молоко!", _
"Куда идет король?", 25.35847
'Закрываем файл
Close ff
'Открываем файл для просмотра
Set ws = CreateObject("WScript.Shell")
ws.Run ThisWorkbook.Path & "\myFile1.txt"
Set ws = Nothing
End Sub

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

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

Так как у файла нет расширения, Windows выведет диалоговое окно для выбора открывающей его программы. Выберите любой текстовый редактор или интернет-браузер.
Sub Test2()
Dim ff As Integer, ws As Object
'Получаем свободный номер для открываемого файла
ff = FreeFile
'Открываем (или создаем) файл для чтения и записи
Open ThisWorkbook.Path & "\myFile2" For Output As ff
'Записываем в файл три строки
Write #ff, "Дает корова молоко!"
Write #ff, "Куда идет король?"
Write #ff, 25.35847
'Закрываем файл
Close ff
'Открываем файл для просмотра
Set ws = CreateObject("WScript.Shell")
ws.Run ThisWorkbook.Path & "\myFile2"
Set ws = Nothing
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

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

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора. При добавлении в комментарий кода VBA Excel, вставьте перед его началом тег [vb] и по окончании кода - [/vb].