VBA – Read Text File into String
We can either read the text file line by line or as an entire file.
Read an Entire Text File into a String
Text in a text file is usually made up of several lines, separated by delimiters. These can be a comma (“,”), a comma with space (“, “), a semicolon (“;”), a semicolon with space (“; “), a space (“ “), a tab (vbTab) or in rare cases any other character such as a tilde (
). The lines are normally separated by a line break (vbCRLF).
The easiest way to read an entire text file in VBA is to run the following code which will place the entire contents of the text file into a string variable. This procedure uses the VBA Open statement and the VBA FreeFile function.
We can also read a text file in VBA by using the FileSystemObject. In the code below we have used late binding with the File System Object.
We can also use early binding in the code and declare the File System Object by creating a reference in our Excel project to the File System Object.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
Как прочитать кусками текстовый файл vba
Основы работы с файлами
Function fun_Txt_Write(ByVal s As String)
Open ThisWorkbook.Path & "\LastDateMail.txt" For Output As #1
Function fun_Txt_Read() As String
Dim s As String
Open ThisWorkbook.Path & "\LastDateMail.txt" For Input As #1
Line Input #1, fun_Txt_Read
‘ Loop Until EOF(1)
fun_Txt_Read = Mid(fun_Txt_Read, 2, Len(fun_Txt_Read) — 2)
По виду доступа файлы можно разделить на:
1) последовательного доступа( текстовые);
2) прямого (произвольного) доступа( типизированные);
Последовательность действий при записи / чтении файлов любого доступа:
1) открыть файл для чтения или записи ( зависит от типа файла)
2) чтение / запись( зависит от типа файла)
Закрыть файл любого доступа:
Close # <числовой идентификатор>
Файлы последовательного доступа (текстовые):
1) представляют последовательность символов, следовательно при открытии файла из текстового редактора (блокнот, wordpad, word) можно видеть значения, которые туда записаны;
2) данные могут иметь некоторую структуру, организованную разделителями; это зависит от использования формата при выводе (вывод может быть форматным и бесформатным);
структурная единица такого файла – обычно строка;
3) данные могут читаться с любого символа находящегося в середине файла, но запись в какую-либо позицию файла новых данных затирает старые данные, начиная с этой позиции.
4) можно писать данные любых типов, при записи они преобразуются к строковому типу; читать можно данные любого типа, при чтении они из строкового преобразуются к нужному типу (если это возможно)
Команды для работы с файлами последовательного доступа:
- открывает файл для чтения:
Open “<имяФайла>” For Input [тип блокировки] As # <числовой идентификатор>
- открывает файл для записи:
Open “имяФайла” For Output [тип блокировки] As # <числовой идентификатор>
- открывает существующий файл для добавления (то есть открывает файл для записи и ставит курсор в конец файла).
Open “имяФайла” For Append [тип блокировки] As # <числовой идентификатор>
Тип доступа к файлу другим процессам, то есть можно ли работать с одним файлом нескольким пользователям и приложениям одновременно.
1) shared – общий доступ
2) lock read – блокировка чтения
3) lock write – блокировка записи
4) lock read write – блокировка чтения и записи
Записать данные в файл:
- бесформатный вывод в файл:
Write # <числовой идентификатор>, список вывода
- ‘ форматный вывод в файл, форматы basic используются в списке вывода; писать в файл после установки указателя можно только этой командой:
Print # <числовой идентификатор>, список вывода
Читать данные из файла:
- чтение из файла с безформатной записью данных:
Input # <числовой идентификатор>, <список переменных>
- чтение из файла с форматной записью данных:
Line Input # <числовой идентификатор>, <список переменных>
Установить указатель на заданную позицию:
Seek # <числовой идентификатор>, <номерСимвола> -после этой команды чтение будут производиться с позиции <номерСимвола> по строкам, запись затирает старый файл.
Создайте в файле с лабораторными работами новый модуль. Наберите текст макроса, который реализует запись в текстовый файл в форматированном и неформатированном виде.
Dim v_i As Integer
Dim v_s As String * 25
Dim v_b As Boolean
Open "test1.txt" For Output As #1
Write #1, “12345 — Ïðèìåð; ”
Write #1, v_i; v_b; v_s
Print #1, v_i; v_b; v_s
Print #1, 333444555
Результат (файл test1.txt после записи):
Рис 1 – файл test1.txt
Наберите текст макроса, который реализует считывание из файла test1.txt с использованием Input Line (считывается целыми строками) и Input (считывается по формату данных).
Для проверки конца файла использован EOF(< числовой идентификатор файла >) . Если EOF(числовой идентификатор файла)=true, значит, достигнут конец файла.
Каждая прочитанная строка из файла test1.txt переписывается test2.txt
Open “g:\vba\test1.txt” For Input As #1
Open “g:\vba\test2.txt” For Output As #2
Dim t As String
Loop Until EOF(1)
Print #2, “___________”
Loop Until EOF(1)

Рис.2 – Результаты считывания из файла test1.txt в файл test2.txt
Файлы прямого (произвольного доступа) доступа :
1) могут содержать данные только одного типа;
2) файл разбит на записи определённой длины, которая определяется типом записываемых данных; каждая запись имеет номер;
3) данные можно читать в любом порядке,
4) нельзя увидеть данные, открыв файл в текстовом редакторе, данные записаны в кодах; проверить что содержится в таком файле можно только из программы и только зная длину одной записи;
5) в файл прямого доступа можно писать массив значений и диапазон ячеек сразу за одну операцию, но . длина массива (диапазона) не должна превышать 32 167 байт .
6) чтобы записать новые данные в конец файла, надо открыть его для записи и установить указатель на последнюю запись.
7) одна команда открывает для чтения и записи., то есть можно читать из файла и записывать в файл открытый одной командой ;
Команды для работы с файлами прямого доступа:
Открыть файл (и для чтения и для записи) :
Open “<имя файла>” For Random As # <числовой идентификатор> Len = Len (<имяПеременной>)
Записать данные в файл:
Put # <числовой идентификатор>, <номерЗаписи>, <переменная> – Записывает переменную в файл в позицию с указанным номером. Начальная позиция -1.
Читать данные из файла:
Get # <числовой идентификатор>, <номерПозиции>, <имяПеременной> – читает запись с указанной позиции в переменную.
Установить указатель на нужную запись в файле:
Seek # <числовой идентификатор>, номер записи ‘после этого запись будет производиться в конец файла.
Пример3: Создать файл, содержащий сведения о студентах (ФИО и дата рождения). Сохранить данные в файле «students». Файл будет из блоков по 33 байта (размер записи Student). Запись поблочная.
Первоначально следует определить тип пользователя в самом начале модуля:
Name As String * 30

Пример4: Написать программу для считывания записей из файла «students»… Переписать данные их типизированного файла в текстовый о тех студентах, возраст которых больше 20 лет.
Dim T As Student
Open “g:\vba\student.txt” For Output As #2
Open “g:\vba\students” For Random As #1 Len = Len(T)
If 2012 – T.b_d > 20 Then Print #2, T.Name & “ “; T.b_d
Loop Until EOF(1)
Особенности работы с файлами:
1) необходимо соблюдать строгое соответствие между командами записи и чтения:
2) номер после знака «#» в операторах открытия, чтения / записи и закрытия файла должен быть одинаковым при работе с одним файлом;
1) просто последовательность байтов или блоков байтов;
2) одна команда открывает для чтения и записи.;
Команды для работы с файлами прямого доступа:
Открыть файл (и для чтения и для записи) :
Open “<имя файла>” For binary As # <числовой идентификатор>
Записать данные в файл:
Put # <числовой идентификатор>, номерЗаписи, переменная ‘ Записывает переменную в файл в позицию с указанным номером.
Читать данные из файла:
Get # <числовой идентификатор>, номерПозиции, имяПеременной ‘ Читает запись с указанной позиции в переменную.
VBA Excel. Операторы чтения и записи в файл
Оператор Input # используется только с файлами, открытыми в режиме Input или Binary. При прочтении стандартные строковые или числовые значения присваиваются переменным без изменения.
Синтаксис оператора Input #:
Компоненты оператора Input #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Переменные – обязательный параметр, представляющий из себя список переменных, разделенных запятой, которым присваиваются значения, считанные из файла.
Особенности применения оператора Input #:
- Элементы данных в файле должны быть указаны в том же порядке, что и переменные в списке Переменные, и соответствовать им по типу данных. Если переменная числовая, а данные текстовые, этой переменной будет присвоено нулевое значение.
- Если при чтении данных достигнут конец файла, чтение прерывается и возникает ошибка. Для ее предупреждения в коде VBA Excel используется функция EOF.
- Чтобы данные из файла могли быть правильно прочитаны и записаны в переменные с помощью оператора Input #, они должны быть записаны в файл с помощью оператора Write #. Он обеспечивает правильное разделение каждого из полей (элементов) данных.
Оператор Line Input #
Оператор Line Input # считывает из файла по одному символу до тех пор, пока не встретится символ возврата каретки (Chr(13)) или последовательность символа возврата каретки и перевода строки (Chr (13) + Chr(10)).
Синтаксис оператора Line Input #:
Компоненты оператора Line Input #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Переменная – обязательный параметр, представляющий из себя имя переменной, объявленной как String или Variant, которой присваивается строка, считанная из файла.
Оператор Write #
Синтаксис оператора Write #:
Компоненты оператора Write #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Данные – необязательный параметр, представляющий из себя одно или несколько числовых или строковых выражений, разделенных запятой, которые нужно записать в файл.
Особенности применения оператора Write #:
- Данные, записанные с помощью оператора Write #, считываются из файла с помощью оператора Input #.
- Если опустить параметр Данные и добавить запятую после Номер_файла, в файл будет добавлена пустая строка.
- Несколько выражений в списке Данные могут быть разделены точкой с запятой или запятой.
- Числовые данные всегда записываются с точкой в качестве разделителя целой и дробной части.
- Оператор Write # вставляет запятые между элементами и прямые парные кавычки вокруг строк при их записи в файл.
- После записи в файл последнего символа из параметра Данные оператор Write # вставляет символы возврата каретки и перевода строки (Chr (13) + Chr(10)).
Функция EOF
Синтаксис функции EOF:
Номер_файла – это номер, присвоенный файлу при открытии с помощью оператора Open.
Функция EOF используется для предупреждения ошибок, вызываемых попытками выполнить чтение после конца файла. Она возвращает значение False, пока не будет достигнут конец файла.
Примеры чтения и записи в файл
Пример 1
Открытие (или создание, если он не существует) текстового файла для чтения и записи и запись в него одной строки, состоящей из двух текстовых и одного числового значений. Файл с именем myFile1.txt будет создан в той же папке, где расположен файл Excel с кодом VBA.
Строки и число можно предварительно присвоить переменным, объявленным с соответствующими типами данных, и использовать их для записи данных в файл (в строках кода с оператором Write #, как в этом и следующем примерах).
Пример 2
Открытие (или создание, если он не существует) файла без расширения для чтения и записи и запись в него трех строк: двух текстовых и одной в числовом формате. Файл с именем myFile2 будет создан в той же папке, где расположен файл Excel с кодом VBA.
Пример 3
Считываем строку, разделенную на отдельные элементы, из файла myFile1.txt и записываем в три переменные, по типу данных соответствующие элементам.
Попробуйте заменить в этом примере строку Input #ff, str1, str2, num1 сначала на строку Input #ff, str1 , затем на строку Line Input #ff, str1 , чтобы наглядно увидеть разницу между операторами Input # и Line Input #.
В следующих примерах (4 и 5) замена оператора Input # на Line Input # не приведет ни к каким изменениям, так как данные в строках файла myFile2 не разделены на элементы (поля).
Пример 4
Считываем поочередно три строки из файла myFile2 и записываем в три элемента массива, объявленного как Variant, так как в этот файл ранее были записаны две строки с текстом и одна с числом.
Работа с файлами и каталогами
Очень часто нужно сохранить какие-либо данные. Для этого существует три способа: сохранение в файл, сохранение в базу данных и сохранение в реестр Windows. Первый способ используется при сохранении информации небольшого объема. Если объем велик, то лучше (и удобнее) воспользоваться базой данных. В реестр Windows обычно сохраняют какие-либо настройки приложения.
Открытие и закрытие файла
Прежде чем работать с файлом, необходимо создать объект файла с помощью инструкции Open . Инструкция имеет следующий формат:
В параметре <Имя файла> указывается путь к файлу. Путь может быть абсолютным или относительным. При указании относительного пути путь определяется с учетом местоположения текущего рабочего каталога, возвращаемого функцией CurDir() , а также текущего диска (сменить текущий диск позволяет процедура ChDrive() ). Чтобы получить путь к папке, в которой находится файл с рабочей книгой, в Excel можно воспользоваться свойством Path объекта ThisWorkbook . Пример создания файла:
Параметр <Режим> может принимать следующие значения:
- Input — чтение в последовательном режиме. Если файл не существует, то генерируется ошибка;
- Output — запись в последовательном режиме. Если файл не существует, то он будет создан. Если файл существует, то он будет перезаписан;
- Append — запись в последовательном режиме. Если файл не существует, то он будет создан. Запись осуществляется в конец файла. Содержимое файла не удаляется;
- Random — чтение и запись в произвольном режиме. Если файл не существует, то он будет создан. Содержимое файла не удаляется;
- Binary — чтение и запись в бинарном режиме. Если файл не существует, то он будет создан. Содержимое файла не удаляется.
Параметр <Доступ> задает тип операции с открываемым файлом. Допустимые значения:
- Read — только чтение;
- Write — только запись;
- Read Write — чтение и запись.
Необязательный параметр <Блокировка> может принимать следующие значения:
- Shared — другой процесс может читать из файла и писать в файл;
- Lock Read — другой процесс не сможет читать из файла;
- Lock Write — другой процесс не сможет писать в файл;
- Lock Read Write — другой процесс не сможет читать из файла и писать в файл.
Параметр <Дескриптор> позволяет указать уникальный целочисленный номер файла в диапазоне от 1 до 511 . Перед номером может быть добавлен символ # . Сгенерировать свободный уникальный номер позволяет функция FreeFile([<Значение>]) . Если в параметре <Значение> задано значение 0 , или параметр не указан, то генерируется число в диапазоне от 1 до 255 , а если значение 1 — то генерируется число в диапазоне от 256 до 511 . Пример использования функции FreeFile() :
В необязательном параметре <Длина> указывается целое число до 32 767 . При использовании произвольного режима значение задает длину записи, а при использовании последовательного режима — размер буфера. Значение игнорируется в бинарном режиме.
Для закрытия файла используется инструкция Close . Формат инструкции:
Инструкция закрывает файлы, дескрипторы которых перечислены через запятую. Если дескрипторы не указаны, то закрываются все открытые файлы. При завершении программы все открытые файлы автоматически закрываются.
Файлы могут быть открыты в трех режимах: последовательном, произвольном и бинарном. Рассмотрим эти режимы подробно.
Чтение и запись в последовательном режиме
Последовательный режим применяется при указании значений Input , Output и Append после ключевого слова For в инструкции Open . Запись в файл производится с помощью инструкции Write . Формат инструкции:
В параметре <Дескриптор> указывается номер файла, который использовался при открытии файла. В параметре <Значения> задаются записываемые значения через запятую, точку с запятой или через пробел (эквивалентно указанию точки с запятой). Если точка с запятой указывается в конце инструкции Write , то следующее выводимое значение будет вставляться на одной строке с предыдущим выводом через запятую, а не на новой строке. Если параметр <Значения> не указан, то вставляется пустая строка. Значения записываются в файл в следующих форматах:
- строки внутри двойных кавычек. Обратите внимание на то, что записываемая строка не должна содержать двойных кавычек, иначе при считывании строка будет разбита на несколько подстрок;
- вещественные числа с разделителем в виде точки;
- дата и время в универсальном формате;
- логические значения True и False в виде #TRUE# и #FALSE# соответственно;
- значение Null в виде #NULL# .
Пример записи в файл:
Чтение из файла производится с помощью инструкции Input . Формат инструкции:
В параметре <Дескриптор> указывается номер файла, который использовался при открытии файла. Во втором параметре задается список переменных, в которых сохранятся считываемые значения. Например, считать данные, записанные в предыдущем примере, можно следующим образом:
Обратите внимание на четвертую инструкцию. Ранее мы записывали строку, в состав которой входит двойная кавычка. При считывании одна строка разбивается на две подстроки. В результате переменная v2 будет иметь значение "При" , а переменная v3 — значение "мер" .
Для записи в файл можно воспользоваться также инструкцией Print . Формат инструкции:
В параметре <Дескриптор> указывается номер файла, который использовался при открытии файла. В параметре <Значения> задаются записываемые значения через запятую, точку с запятой или через пробел (эквивалентно указанию точки с запятой). Если указывается запятая, то следующее значение выводится в начале следующей зоны (по умолчанию начало зоны расположено в каждом 14-ом столбце), а если точка с запятой — то следующее значение выводится сразу после предыдущего:
Если точка с запятой указывается в конце инструкции Print , то следующее выводимое значение будет вставляться на одной строке с предыдущим выводом, а не на новой строке. Если параметр <Значения> не указан, то вставляется пустая строка. Значения записываются в файл в следующих форматах:
- строки без двойных кавычек;
- вещественные числа с разделителем в виде запятой;
- дата и время в коротком формате;
- логические значения True и False в виде строк True и False соответственно;
- значение Null в виде строки Null .
Пример записи в файл:
Второй параметр может содержать следующие функции:
- Spc(<Количество>) — позволяет вставить указанное количество пробелов. Пример:
- Tab[(<Количество>)] — если функция указывается без параметра, то происходит переход в начало следующей зоны (эквивалентно вставке запятой между значениями):
Параметр <Количество> задает номер столбца, с которого начинается вывод:
Прочитать файл, записанный с помощью инструкции Print , позволяет инструкция Line Input . Чтение производится построчно при каждом вызове инструкции. Формат инструкции:
Прочитаем две строки из записанного ранее файла:
Чтобы прочитать все строки из файла следует воспользоваться функцией EOF(<Дескриптор>) . Функция возвращает значение True , если был достигнут конец файла, и False — в противном случае. Вывести все строки из файла позволяет следующий код:
Инструкция Width позволяет указать предпочитаемую ширину строки. Формат инструкции:
Параметр <Ширина> может содержать значения в диапазоне от 0 до 255 . Если указано значение 0 , то ширина не ограничена. Если длина строки больше указанного значения, то значение игнорируется и строка выводится полностью. Пример указания ширины, равной трем символам:
Для чтения файла можно также воспользоваться функцией Input(<Количество символов>, [#]<Дескриптор>) , которая читает из файла указанное количество символов и возвращает их. Пример:
Чтение и запись в произвольном режиме
Произвольный режим применяется при указании значения Random после ключевого слова For в инструкции Open . Длина записи в произвольном режиме является фиксированной и задается с помощью параметра <Длина> (целое число до 32 767 ) в инструкции Open . При чтении и записи длина должна быть указана одинаковой. Запись в файл производится с помощью инструкции Put . Формат инструкции:
В параметре <Дескриптор> указывается номер файла, который использовался при открытии файла. В параметре <Позиция> задается номер позиции (нумерация начинается с 1 ) в которую производится запись. Если параметр не указан, то запись производится в следующую позицию после текущей позиции. Параметр <Значение> задает записываемое значение. Если длина значения больше длины, указанной в параметре <Длина> , то генерируется ошибка. Если производится запись строки произвольной длины, то значение в параметре <Длина> должно быть на 2 байта больше фактической длины строки. Пример записи в файл:
Чтение файла производится с помощью инструкции Get . Формат инструкции:
В параметре <Дескриптор> указывается номер файла, который использовался при открытии файла. В параметре <Позиция> задается номер позиции (нумерация начинается с 1 ) из которой производится чтение. Если параметр не указан, то читаются данные из следующей позиции после текущей позиции. Пример:
Чтение и запись в бинарном режиме
Бинарный режим применяется при указании значения Binary после ключевого слова For в инструкции Open . Длина записи в бинарном режиме является фиксированной и равна одному байту. Если указано значение в параметре <Длина> , то это значение игнорируется.
Чтение и запись в бинарном режиме осуществляется точно также, как и при использовании произвольного режима. Прочитать данные из файла позволяет инструкция Get , а записать данные инструкция Put . В параметре <Позиция> в этих инструкциях указывается порядковый номер байта.
Пример записи строки в файл:
Пример чтения строки из файла:
В этом примере мы воспользовались функцией LOF(<Дескриптор>) , которая позволяет получить длину файла в байтах. Чтобы считать данные из бинарного файла в строковую переменную необходимо в переменной создать строку такого же размера. В данном случае мы с помощью функции Space() создаем строку из такого же количества символов, что и размер файла. Обратите внимание на то, что использовать функцию EOF() в бинарном режиме нельзя, так как она всегда возвращает значение False .
Для чтения бинарного файла можно также воспользоваться следующими функциями:
- Input(<Количество символов>, [#]<Дескриптор>) — читает из файла указанное количество символов и возвращает их;
- InputB(<Количество байтов>, [#]<Дескриптор>) — читает из файла указанное количество байтов и возвращает их.
Запишем строку в бинарный файл, а затем считаем ее с помощью функции Input() :
Перемещение указателя внутри файла
Каждый открытый файл поддерживает указатель на текущую позицию в файле. Для перемещения и манипулирования позицией указателя внутри файла используются следующие функции и процедуры:
- Loc(<Дескриптор>) — в произвольном режиме возвращает номер текущей позиции, а в бинарном режиме — номер текущего байта. Первый байт имеет позицию 0 ;
- Seek(<Дескриптор>) — в произвольном режиме возвращает номер текущей позиции, а в бинарном режиме — номер текущего байта. Первый байт имеет позицию 1 ;
- Seek [#]<Дескриптор>, <Позиция> — устанавливает указатель в позицию <Позиция> . Первый байт имеет позицию 1 . Если указано значение меньше 1 , то генерируется ошибка. Если значение превышает количество байтов в файле, то файл увеличивается до указанной позиции;
- LOF(<Дескриптор>) — возвращает длину файла в байтах.
Запишем строку в файл в бинарном режиме, а затем переместим указатель в начало файла и считаем содержимое файла посимвольно в строку (листинг 12.1).
Листинг 12.1. Перемещение указателя внутри файла
Чтение и запись файлов в кодировке UTF-16
Все строки, которые мы записывали ранее, сохранялись в файле в кодировке, принятой в системе по умолчанию. В моем случае в кодировке Windows-1251. Если необходимо записать данные в кодировке UTF-16 или прочитать данные, то можно воспользоваться функцией StrConv() (см. разд. 6.8) для преобразования кодировки. В качестве примера запишем данные в фай, а затем прочитаем и выведем их (листинг 12.3).
Листинг 12.2. Чтение и запись файлов в кодировке UTF-16
Обратите внимание на инструкцию
Комбинация символов с кодами 255 и 254 является меткой порядка байтов (сокращенно BOM (Byte Order Mark)). Эта метка является обязательной для кодировки UTF-16. При чтении данных мы пропускаем их и начинаем чтение с позиции 3 .
Чтение и запись файлов в кодировке UTF-8
Работа с файлами в кодировке UTF-8 выполняется сложнее. В этом случае необходимо воспользоваться функциями MultiByteToWideChar() и WideCharToMultiByte() , входящими в состав Win32 API. Чтобы это стало возможным, нужно в самом начале модуля вставить следующий код:
Далее создадим две функции: ToUtf8() (для преобразования строки в кодировку UTF-8) и FromUtf8() (для преобразования кодировки UTF-8 в Unicode):
Теперь мы можем пользоваться этими функциями для чтения и записи файлов в кодировке UTF-8:
Статьи по Visual Basic for Applications (VBA)
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов