Foreversoft.ru

IT Справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel чтение текстового файла

Функции для работы с текстовыми файлами

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

Используя эти функции, вы при помощи одной строки кода сможете записать текст из переменной в файл, или наоборот, загрузить содержимое текстового файла в переменную.

Чтение текстового файла в переменную:

  • 82039 просмотров

Комментарии

Могу написать макрос под заказ (платно)

Как можно задать строки для чтения/записи из txt?
Пример:
Есть файл txt
Прораб
Вася
Петя

Работники
Саша
Андрей
Коля

Необходимо занести имена прорабов в один массив arr1(), а имена работников в другой arr2(). Изменить имена рабочих и их количество и вернуть в txt новые значения. Т.е. массивы динамические, а идентифицируем начало и конец соответствующего массива в txt по шапке в начале и пустой строке в конце.

В UTF-8 сохранять так
Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean
On Error Resume Next: Err.Clear
Set stream = CreateObject(«ADODB.Stream»)
stream.Type = 2 ‘text
stream.Charset = «utf-8»
stream.Open
stream.writetext Replace(txt, Chr(10), vbNewLine)
stream.savetofile filename, 2
End Function

Добрый день!
Помогите еще в одной вещи.
По дефолту пишет в ANSI, а нужно UTF-8

Neri, замените в коде

Добрый день!
У меня есть ячейка, в которой спомощью функции сцепить собраные несколько значений и исползуется символ переноса строки
Выглядит это примерно вот так:
=СЦЕПИТЬ(R3 & СИМВОЛ(10) & S3 & СИМВОЛ(10))
«Строка 1»
«Строка 2»
Как можно записать в файл, но чтобы каждая строка писалась с новой строки?

Добрый день. А кто подскажет, какие применять команды для поиска части текста в файле (.xml), потом копировать его и этим текстом переименовывать папку или файл этот же? Спасибо.

Используйте функцию ChangeFileCharset из этой статьи:
http://excelvba.ru/code/Encode

получится что-то типа такого:

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

ActiveWorkbook.SaveAs Filename:=path, FileFormat:=xlTextWindows, _
CreateBackup:=False
Dim y As String
Open path For Input As #1
Line Input #1, y
Close #1
Open path For Output As #2
y = Replace(y, «»»», «»)
y = StrConv(y, vbUnicode)
y = Replace(y, Chr(34), «»)
Print #2, y
Close #2

точно в несколько раз больше?
fnum = FreeFile()
Open «C:11.txt» For Input As #fnum
Temp = Split(Input(LOF(fnum), #fnum), vbNewLine)
Close #fnum

Никто не спорит, — улучшать (дорабатывать) функцию можно бесконечно.
Чтобы нужные строки из файла брались, — кода будет в несколько раз больше.

Можете сами написать подобную функцию, взяв за основу этот код,
и сделав выборку нужный строки из массива.
Ну или заказать готовое решение.

А вопрос то актуальный. Дополнив функцию этой возможностью, её функционал стал бы гораздо качественне.

Можно с помощью Вашей функции взять только определенные строки, например со 2 по 20

Уберите строку Option Explicit — тогда не будет выскакивать ошибка Variable not defined

Пишет Variable not defined, указывая на binaryStream. Странно, ведь там все так же. 🙁

Mix, используйте эту функцию с третьим параметром «utf-8noBOM«

Добрый вечер!
Делаю по второму примеру, файл сохраняется в кодировке ANSI. Подскажите, как изменить данный пример чтобы сохранялось в кодировке utf-8 без BOM?

Это мое первое общение с VBA 🙂

Можно, конечно, и номер строки задать, откуда будут вставляться данные, — но код будет намного сложнее.
Алгоритм:
1) считываем весь текст из файла
2) разбиваем его на 2 части (по заданному номеру строки
3) формируем новый текст: 1-я часть + вставляемый текст + 2-я часть
4) записываем результат в тот же файл

Насчёт XML: очень не рекомендую использовать такой метод для XML, очень вероятны ошибки.
Там проще использовать объектную модель XML, программно добавляя новые узлы.

Очень интересна функция Добавление в текстовый файл из переменной, но так как я только начала изучать VBA, непонятно можно ли указать номер строки (в середине текста) начиная с которой начать добавление строк. И можно ли использовать эту функцию для добавления xml файл?

Читать еще:  Vba excel условие if

Здравствуйте! Подскажите пожалуйста, какой код надо написать, чтобы работал такой макрос: по нажатию кнопки выбирать папку, в которой есть текстовые файлы. В книгу вставляются листы с названиями от имени файлов в этой папке и в эти листы вводятся данные из этих файлов. Файлы содержат разную информацию: матрица, фамилии и дата рождения и т.д. Спасибо.

Anddre — если заменить «ReadTXTfile» на «txt»,
то тогда функция будет всегда возвращать пустое значение. Любая Ф-я почти всегда должна содержать оператор присвоения значения переменной с именем самой функции.

Наконец я нашел решение! Спасибо огромное!
В моем случае, при сохранении TXTфайла с разделителями табуляции, нужно было записать первым пустой столбец, но любимый EXCEL сносил его и записывал файл таким образом что все столбцы смещались влево на одну позицию. запись Cells(1,1) = chr(09) приводила к возникновению цепочки сиволов кавычки-табуляция-кавычки в начале файла.
Пришлось прописывать Cells(1,1) = «?» (покрайней мере его видно в тексте), и тогда структура вроде сохранялась. Но система под которую этот файлик готовился могла на такое «нововведение» заругаться.
Как же я обрадовался когда удалось удалить из первой позиции аккруратно вырезать этот «?» и перезаписать файл в чистом виде.
Еще раз спасибо.

Спасибо за ресурс! Очень полезный. У меня несколько вопросов:

1) OpenTextFile(filename, 1, True)
второй и третий параметр этой функции что означают?
(а то редактор не выводит всплывающую подсказку)

2) Можно ли как-то считать только вторую строку текстового файла или записать во вторую строку?

3) При выведении значения в ячейку с помощью ReadTXTfile, в конце строки вместо переноса у меня стоит квадратик (нераспознанный знак), этого как-то можно избежать?

Заменить-то можно, но зачем?
Тогда придётся писать в коде дополнительную строку ReadTXTfile = txt
чтобы функция возвратила считанный из файла текст.

А так, как сейчас, всё работает без лишних строк.
(Мы намеренно записываем текст именно в ReadTXTfile, а не в какую-то текстовую переменную, поскольку функция должна возвратить загруженный текст)

Read/Parse text file line by line in VBA

I’m trying to parse a text document using VBA and return the path given in the text file.
For example, the text file would look like:

I want the VBA to load 1 line at a time, and if it starts with a * then move to the next line (similar to that line being commented). For the lines with a file path, I want to write that path to cell, say A2 for the first path, B2 for the next, etc.

The main things I was hoping to have answered were:
1. What is the best/simple way to read through a text file using VBA?
2. How can I do that line by line?

Создан 17 июл. 12 2012-07-17 18:33:54 dancran

4 ответа

for the most basic read of a text file, use open

Создан 17 июл. 12 2012-07-17 18:48:56 SeanC

I’m a little late to the party, but Line Input has problems with anything other than strictly a CR or CRLF combination (i.e. LF on its own) — FSO has no such problems (but yeah, is probably a little bit slower) – Cor_Blimey 20 авг. 13 2013-08-20 21:28:09

Remember Close #FileNum at the end! – Magnus Smith 26 май. 14 2014-05-26 11:15:03

For anyone else wondering: ‘DataLine’ excludes the terminating ‘CR’ or ‘CRLF’ ([source](https://msdn.microsoft.com/en-us/library/aa243392%28v=vs.60%29.aspx)) – Felipe 11 май. 15 2015-05-11 15:35:58

ON ERROR is required. – NoChance 15 июл. 17 2017-07-15 21:32:11

@NoChance, not if the file is just as expected, but programming styles were not what the question is about. – SeanC 16 июл. 17 2017-07-16 13:14:58

I find the FileSystemObject with a TxtStream the easiest way to read files

Then with this txtStream object you have all sorts of tools which intellisense picks up (unlike using the FreeFile() method) so there is less guesswork. Plus you don’ have to assign a FreeFile and hope it is actually still free since when you assigned it.

You can read a file like:

NOTE: This requires a reference to Microsoft Scripting Runtime.

Создан 17 июл. 12 2012-07-17 19:59:02 Brad

Читать еще:  Excel web app

thanks for the reply Brad. I think this also will accomplish what I wanted just fine – dancran 17 июл. 12 2012-07-17 21:29:03

Actually, without dimensioning ‘txtStream’ as a ‘TextStream’ object, there will be no intellisense – ElRudi 22 апр. 16 2016-04-22 09:11:44

For completeness; working with the data loaded into memory;

Создан 18 июл. 12 2012-07-18 13:06:39 Alex K.

This is the correct answer. You can do the same in FileSystemObject, but FSO will often fail to run due to security restrictions, and it is significantly slower. – Nigel Heffernan 18 июл. 12 2012-07-18 17:00:36

. but assumes the file will fit into memory – Chris Kimpton 31 май. 13 2013-05-31 07:36:09

You Can use this code to read line by line in text file and You could also check about the first character is «*» then you can leave that..

Создан 26 дек. 12 2012-12-26 17:09:02 satheesh kumar

Работа с файлами VBA

Приветствую! Сегодня мы поговорим о файлах, а точнее, как получать информацию из текстовых файлов в VBA. И будем повышать ваше умение программировать, как обычно, на примере.

В обычном текстовом файле содержатся строки:

Приветствуем Вас на сайте CodeTown.ru
здесь Вы найдёте много интересных
примеров на разные темы
и на разных языках.
Наслаждайтесь=)

Необходимо вывести их на лист в Excel, чтобы каждое слово находилось в своей ячейки с учётом пробелов.

Open «file.txt» For Input As #1 — таким образом прописываем путь к файлу, который мы хотим прочитать. Помните, что наши пути могут различаться. Также в конце команды мы присваиваем файлу идентификационный номер. В нашем случае 1.

Do Until EOF(1) — инициализация цикла чтения файла, пока не кончится файл (End Of File). В скобках функции указываем идентификационный номер файла, с которым мы работаем.

Line Input #1, Data — построчное считывание информации из файла. То есть, за каждую итерацию цикла Do Until EOF(1)F(1) мы обрабатываем одну строку.
Функция Line Input является наследуемой функцией от функции Input, которая в свою очередь позволяет считывать данные разного формата из открытых файлов разного типа. Подробный синтаксис вы можете найти здесь.

Как видите, программа небольшая и мы прошли уже основную часть. Мы смогли считать данные в виде строки, теперь, необходимо её обработать. То есть, поделить на слова и записать каждое в ячейку.

Do While InStr(Data, » » ) <> 0 — инициализирует цикл разделения строки на слова по пробелам. Собственно, сама функция InStr(Data, » «) занимается поиском символа, указанного на второй позиции (в нашем случае пробел) в строке, указанной на первой позиции (Data). Поиск осуществляется слева направо. Результатом функции является позиция найденного символа. Подробнее читайте тут. Таким образом, цикл не закончится, пока не закончатся пробелы. Однако, следует помнить, что пробел редко стоит в конце строки(обычно из-за ошибки автора). По этому после выхода из цикла в переменной Data останется последнее слово строки. Не забудем его вывести.

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

Если Вам какие-то команды остались не ясны, советую почитать предыдущие статьи, там вы найдёте примеры на работу с ними.

Наш вывод:

Вот, собственно, и всё, разобрали некоторые моменты работы с файлами в VBA. Задавайте вопросы в комментариях. Надеюсь вы прониклись магией VBA, если же нет, читайте продолжение. =)

Работа с текстовыми файлами в Visual Basic

Совсем недавно в непомню какой коференции я видел запись какого-то человека, который просил, чтобы хоть кто-нибудь объяснил ему элементарную работу с файлами. Казалось бы такое простое. Но это простое для тех, кто уже хоть немного продвинулся в программировании, а кто это только начал? Это же, действительно, непроходимый лес! И я сильно сомневаюсь, чтобы кто-нибудь из других наших Web-мастеров когда-нибудь уделит этому хоть какое-то внимание. Поэтому этим займусь я и попробую в этой статье показать только основы.

1. Открытие файла для чтения информации из него.

Итак, чтобы безпроблемно работать с текстовыми файлами сначала их нужно открыть. Делается это с помощью оператора Open, например:

Читать еще:  Olap в excel

Open «c:\text.txt» For Input As #1

Обратите внимание на режим открытия файла — Input (для чтения). Здесь файл text.txt открывается для считывания под номером 1. Внимание. Номер файла — обязательный параметр, и вводить его нужно всегда! Если ваша программа будет иметь дело не с одним десятком открытых файлов, то уследить за их нумерацией будет сложновато. Используйте для этого функцию FreeFile. Она возвращает ещё не занятый номер (от 1 до 511) для файла:

Dim FileNum As Integer

Open «c:\text.txt» For Input As FileNum

Так, файл открыли! Теперь из него нужно что-нибудь считать. Оператор Line Input считывает из открытого файла по одной строке при каждом вызове. Поэтому для считывания из файла нужно построить цикл, который бы вызывал этот оператор до тех пор, пока не дошёл бы до конца файла:

цикл выполняется, пока конец файла не достигнут

Do Until EOF(FileNum)

при каждом вызове оператора Line Input он записывает в

переменную новою строку

Line Input #FileNum, переменная

Закрыть открытый файл можно оператором Close #FileNum. А теперь вот как это должно выглядеть в практике:

Dim FileNum As Integer

Dim txt As String

Dim alltxt As String

открываем файл в режиме чтения

Open «c:\text.txt» For Input As FileNum

запускаем вышеупомянутый цикл

Do Until EOF(FileNum)

считываем строку из файла с номером FileNum и кладём её в

Line Input #FileNum, txt

теперь к переменной alltxt добавляем содержимое переменной txt —

строки и vb-константу vbCrLf (Chr(13)+Chr(10)), т.к. каждая строка

должна быть с новой строки 🙂

alltxt = alltxt + txt + vbCrLf

закрываем файл с номером FileNum

выводим содержимое переменной alltext

2. Открытие файла для записи информации в него.

Записать информацию в файл ещё проще. Эта операция отличается от предыдущей только тем, что открыть файл надо в режиме записи:

Open «c:\text.txt» For Output As FileNum

и вместо цикла нужно вставить оператор Print #, который записывает в файл содержимое переменной:

Print #FileNum, «Азбука Visual Basic»

Print #FileNum, alltext

Dim FileNum As Integer

Dim txt As String

открываем файл в режиме записи

Open «c:\text.txt» For Output As FileNum

Print #FileNum, txt

закрываем файл с номером FileNum

Проверьте содержимое файла.

И ещё хочу предложить второй способ записи информации в файл — с помощью API-функции WritePrivateProfileStringByKeyName. Считывать же информацию нужно с помощью API-функции GetPrivateProfileString. Теперь расскажу — как всё это работает?

1.Создайте стандартный проект.

3.Удалите форму и кликните два раза по модулю.

4.В раздел General Declarations следующее объявление двух, вышеназванных функций:

Declare Function GetPrivateProfileString& Lib _

«kernel32» Alias «GetPrivateProfileStringA» (ByVal _

lpszSection$, ByVal lpszKey$, ByVal lpszDefault$, _

ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, _

lpszSection -имя секции

lpszKey — имя ключа

lpszDefault — значение, возвращаемое по умолчанию, при строке «»

lpszReturnBuffer — место для строки

cchReturnBuffer — размер (длина) места для строки

lpszFile — имя файла

Declare Function WritePrivateProfileStringByKeyName% Lib _

«kernel32» Alias «WritePrivateProfileStringA» (ByVal _

lpApplicationName As String, ByVal lpKeyName As String, _

ByVal lpString As String, ByVal lplFileName As String)

lpApplicationName — имя секции

lpKeyName — имя ключа

lplFileName — имя файла

5.Создайте подпрограмму Main — просто введите Sub Main.

6.В подпрограмму Main введите:

создаём файл test.ini, в нём заголовок «Main», ключ «URL» _

и строку «http://members.tripod.de/cmvb»

Call WritePrivateProfileStringByKeyName(«Main», «URL», _

создаём файл test.ini, в нём заголовок «Main», ключ «eMail» _

и строку «v1500mk@t-online.de»

Call WritePrivateProfileStringByKeyName(«Main», «eMail», _

При запуске проекта на диске С: тут же будет создан файл Test.ini со следующим содержимым:

8:-O. Не правда ли, просто? А считать это чуть-чуть сложнее. Итак, файл создан, теперь поробуем считать информацию оттуда. Удалите всё, что находится между строками «Sub Main()» и «End Sub». Впишите следующее:

создаём переменную, в которую будет передоваться строка

Dim MyString As String

«набиваем» её пробелами

открывается файл файл test.ini, и в переменную MyString _

записывается строка из заголовка «Main», ключа «URL»

Call GetPrivateProfileString(«Main», «URL», «», MyString, _

выводится на экран содержимое переменной MyString

открывается файл файл test.ini, и в переменную MyString _

записывается строка из заголовка «Main», ключа «eMail»

Call GetPrivateProfileString(«Main», «eMail», «», MyString, _

выводится на экран содержимое переменной MyString

Ссылка на основную публикацию
Adblock
detector