Страницы: 1 2 След.
RSS
Макрос импорта строк из txt-файла
 
Здравствуйте, уважаемые форумчане.
Нужен небольшой макрос импорта данных из текстового файла в активный лист Excel.
Перебрал много разных предложений в интернете. Но каждый раз макрос делает что-нибудь не так как надо.

Исходные данные (прикрепляю):
Текстовый файл "Текст.txt" содержит строки с буквами, цифрами, пробелами и др. знаками.
Файл Excel "Таблица.xlsm" содержит Лист1 с кнопкой макроса (там же показано - Как должен выглядеть Столбец A по завершении работы).

  В процессе своей работы макрос должен:
1-Открыть проводник (диалог), позволяющий найти файл "Текст.txt";
2-Открыть ТЕКУЩУЮ (!) папку (где находится файл Excel, а не где-нибудь в дебрях ПК);
  После того как выберем файл "Текст.txt"
3-Не открывать его как временный файл Excel, а СКОПИРОВАТЬ (!) с него данные.
4-Вставить эти данные в активный Лист1, начиная с ячейки A1 с таким условием:
5-1-я строчка txt = ячейка A1 Листа1
6-2-я строчка txt = ячейка A2 Листа1 и т.д.
7-Должны заполниться ячейки только из столбца A. Все остальные столбцы не задействуются.
8-Строки не должны разрываться.
9-Слова или цифры не должны слипаться. Пробелы между словами не должны исчезнуть.

Спасибо всем, кто откликнется!
 
С таким ТЗ Вам скорее всего в платный раздел
 
Chelovek, потестируйте файл
 
New,
Проверил. На этом и на других файлах. Всё работает в точном соответствии с поставленными условиями. Очень благодарен. Я оставлю вам сообщение в личке.
 
Цитата
Chelovek написал: Нужен небольшой макрос импорта данных из текстового файла в активный лист Excel.
Самый самый небольшой макросик, который смог за сегодня найти на бескрайних просторах интернета.(Весь день искал даже на обед не пошел)
Код
Sub enstaralgkl()
    Dim FileName$, Arr1
FileName = "Текст.txt": FileName = ThisWorkbook.Path & "\" & FileName
    Open FileName For Input As #1: FileName = Input(LOF(1), #1)
    Arr1 = Split(FileName, vbNewLine): Reset
Range("A1").Resize(UBound(Arr1)) = WorksheetFunction.Transpose(Arr1)
End Sub
Функция открытия диалогового окна есть в файле NEW
 
Евгений Смирнов Ваш код работает. Впечатляет Ваш профессионализм. Большое спасибо за помощь! Если что - буду обращаться к Вам.
 
Евгений Смирнов, Евгений, т.к. массив после Split создаётся с нулевым индексом, то у вас не выгружается на лист последняя строка (Ярославль_609_610_100,16%).  Надо добавлять +1 при выгрузке на лист
Код
Range("A1").Resize(UBound(Arr1) + 1) = WorksheetFunction.Transpose(Arr1)

P.S. Так же, я надеюсь, вы знаете ограничения связанные с Transpose? На примере от ТС это не критично, но кто знает, какие реальные файлы у ТС в работе
Изменено: New - 01.02.2022 00:02:35
 
Chelovek: Спасибо за оценку моего скромного труда, но до профи мне далеко, как до Китая пешком. (Просто в некоторых вопросах, которые меня интересуют, стараюсь до конца разобраться)

New: Здравствуйте. В вашей функции CountLinesInTextFileFast надо добавлять +1 т.к. она считает количество строк в файле. В моем не надо. И вообще зачем вы 2 раза читаете текстовый файл. Первый раз чтобы посчитать кол-во строк, а второй, чтобы заполнить массив. Это все можно сделать за одно считывание (В данном случае). Про ограничение Transpose знаю, уже натыкался. Это легко обойти добавить цикл.(Сделать свою Transpose)
 
Цитата
написал:
мне далеко, как до Китая пешком
Жители Благовещенска никак не могут понять, является ли Евгений профи или нет )

UPD Этот край упомянул из-за близости к Китаю. Я сам не из этих мест.
Изменено: МатросНаЗебре - 01.02.2022 12:14:00
 
МатросНаЗебре Привет жителям Благовещенска, почти земляк. Но мне подальше до Китая, чем вам. А к профи не отношусь. Если узнаете о моей профессиональной деятельности будете сильно удивлены. (Никогда не занимался программированием профессионально это честно без шуток)

МатросНаЗебре А я  подумал сибиряк значит земляк. Обманули меня.
Изменено: Евгений Смирнов - 01.02.2022 14:16:08
 
Цитата
Евгений Смирнов написал:
В моем не надо.
Евгений, терять часть данных (последнюю строку) при импорте данных - не очень хорошая вещь.
Или вы мне не верите, что ваш код не переносит последнюю строку из текстового файла в Excel?
 
New Павел как ни странно у меня все нормально отрабатывает. вроде я текстовый файл из темы не правил. сейчас еще попробую скачать заново

PS New Вы правы надо добавить +1. С файлом который в теме все нормально, но там последняя строка пустая. Если ее удалить, то последняя не выводится.
Изменено: Евгений Смирнов - 01.02.2022 11:39:23
 
Здравствуйте.
В целом моя проблема в незнании VBA.
А одна из проблем - копирование данных из текстового файла в ексель автоматически.
В приведённом выше примере данные копируются по нажатию кнопки, а можно ли запускать
макрос по изменению текстового файла, и копировать только последнюю строчку из него?
Скажите есть ли такая возможность?
 
Можно отслеживать дату сохранения текстового файла.
Если она меняется, считывать последнюю строчку.
Отслеживать можно или периодическим макросом, или каким-нибудь, например, Worksheet_SelectionChange.
 
Код
Sub TestRLL()
  MsgBox "<" & ReadLastLineFrom("d:\igor\f1.txt") & ">"
End Sub

Function ReadLastLineFrom$(FileName$)
  Dim fso, Txt, s$, p&
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set Txt = fso.OpenTextFile(FileName, 1)
  s = Txt.ReadAll:  Txt.Close: Set fso = Nothing
  ReadLastLineFrom = Right(s, Len(s) - InStrRev(s, vbLf))
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо!
Буду разбираться куда енто прикрутить.
 
код нужно скопировать в стандартный модуль
а пользоваться можно вплоть до того, что в А1 написать полный путь к файлу, а, например, в А2  написать  
Код
=ReadLastLineFrom(A1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код работает, только когда вручную запускаешь макрос. И данные не записываются в ячейку.
Сообщение с нужным текстом данных выводиться. Отключите пожалуйста функцию сообщения.


В Текст.txt у меня приходят данные со считывателя рфид карт автоматически, с помощью дополнительной
программы читающей ком порт. Но даже если ввожу данные вручную, то код тоже нужно запускать вручную.
Изменено: юнат - 19.10.2022 09:36:28
 
пока условия вашей задачи известны только вам одному - вам самому ее и решать
когда сможете обьяснить условия задачи для всех - может кто-то подскажет как ее решить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, благодарю за помощь!
Раз из текстового файла сложно записывать, спрошу в ветке импорта данных из ком порта сразу в ексель.
 
что сложно?
я написал вам функцию которая возвращает последнюю строку из текстового файла. пользуйтесь, записывайте полученную строку куда угодно, где и что тут сложно?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, для меня всё непонятное - сложно.
Я думал/хотел чтоб макрос сам работал, автоматически, при изменении данных в Текст.txt.
А он запускается только принудительно, выдаёт значение только в сообщении и не записывает
данные в ячейку екселя.
Для моей задачи можно, допустим, чтоб раз в секунду макрос проверял
изменение файла Текст.txt., и если да, то автоматически копировал последнюю строчку в ексель.
В екселе у меня простенький макрос, который "узнаёт" длинный номер карты и меняет
его на простой десятичный номер.
Может у меня с настройками/надстройками екселя что то не правильно и поэтому ваш макрос не вводит значение в ячейку ексель?
 
У меня задача читать рфид карты и преобразовывать их длинный номер в десятичную цифру (например 01004C11BBE7 = 57).
Человек подносит карту к считывателю, который подключен к ком порту компа, и с момента считывания
карты все преобразования должны быть выполнены автоматически.
 
а для меня сложно угадывать что думает другой человек, особенно если он об этом только думает, но ничего не говорит (не пишет)
вы не обязаны знать VBA
но если не знаете настолько, что не знаете как вместо
MsgBox "<" & ReadLastLineFrom("d:\igor\f1.txt") & ">"
(демонстрация результата работы функции ReadLastLineFrom в окне сообщения)
результат работы этой функции положить в ячейку, то это просто:
[a1] = ReadLastLineFrom("d:\igor\f1.txt")
это все. результат в ячейке А1, если нужна строка как положить результат в другую ячейку - пишите в какую, напишу вам код))
и
относительно глобальной задачи: кто-то же когда-то пишет данные в текстовый файл?
он может  записать эти же данные и в нужную вам ячейку и не нужно ничего проверять раз в секунду, потому что за секунду в компьютере проходят тысячи событий и в вашем файле пока вы ждали секунду может оказаться 10 добавленных строк и вы получите только последнюю из них, а 9 уже похоронено в недрах файла
и...
бесполезно писать советы человеку, который не может изменить двух байт в коде, поможет только полностью работающий код (желательно сразу в файле, чтобы случайно не был скопирован не туда или не продублирован рядом с прошлым, что приведет отказу компилятора такое "исполнять"))
и...
это все перестает иметь хоть какое-то отношение к обсуждаемой тут теме. формулируйте свои вопросы в отдельных темах, не нужно эту тему превращать в мусорку для всего подряд
Изменено: Ігор Гончаренко - 20.10.2022 09:47:50
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Порадовал)))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ігор Гончаренко, я только добавляю исходные данные, а вы уже ругаетесь что это мусор, в то же время пишите что я ничего не говорю.
А тема у меня не поменялась  - "Макрос импорта строк из txt-файла" с уточнением: "автоматически", пытаюсь соблюдать правила форума, не плодить лишнего.
Если для этого нужна отдельная тема, извиняйте, не знал.
Спасибо за макрос - заработал, жаль что не автоматически. И условие 1 раз в секунду меня полностью устраивает, но при условии что txt файл был изменён для исключения постоянного вывода данных раз в секунду.
Прога что записывает в txt файл не хочет записывать в ексель, она триал-версия, я ей пользуюсь для наладки, хотелось бы в дальнейшем сразу из ком порта читать в ексель. Но пока все хотелки разом не реализовать, вот и пытаюсь постепенно выстраивать рабочую цепочку. До решения всей задачи мне как от Калининграда, вам как от Благовещенска до Китая пешком.
Чтоб вы понимали мой уровень владения компьютером, я наморщил лоб чтоб узнать путь C:\Users\Parking\Desktop\Текст.txt
Да-да, бывают и такие люди.
Не Программисты - это люди, решающие проблемы, о существовании которых Программисты не подозревают, методами, которые Программисты не понимают! (есть и такая философия)))
 
читайте название темы, подумайте о чем это
как импортировать строки из текстового файла уже выясненно
после вашего уточнения выяснено даже как импортировать одну последнюю строку: ReadLastLineFrom(...)
а вот в каком месте и при каких обстоятельствах (как часто)  нужно это делать - можно выяснить только у вас и это не имеет НИКАКОГО отношения к обсуждаемой тут теме
Изменено: Ігор Гончаренко - 20.10.2022 12:30:27
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, большое спасибо за помощь, почти все свои задачи решил, осталась только до ком порта достучатся.
Так же благодарю МатросНаЗебре,  за Worksheet_SelectionChange, прикрутил кое как, работает.
 
Хелп ми! Поломалось! Не работает!
А как хорошо работало.
Код
Function ReadLastLineFrom$(FileName$)
  Dim fso, Txt, s$, p&
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set Txt = fso.OpenTextFile(FileName, 1)
  s = Txt.ReadAll:  Txt.Close: Set fso = Nothing
  ReadLastLineFrom = Right(s, Len(s) - InStrRev(s, vbLf))
End Function 

Если курсор в текстовом файле спрыгивает на следующую пустую строчку, то этот вакуум копируется в ячейку ексель.
Подскажите как не копировать пустую последнюю строчку, а подняться на строчку выше, или предпоследнюю строчку со значением?
 
попробуйте так
Код
Function ReadLastLineFromTXT(FileName As String) As String
    Dim FSO As Object, TxtFile As Object, str As String, pos As Long
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    If Not FSO.FileExists(FileName) Then GoTo ExitMark:
    Set TxtFile = FSO.GetFile(FileName)
    If TxtFile.Size = 0 Then GoTo ExitMark:
    Set TxtFile = FSO.OpenTextFile(FileName, 1)
    str = TxtFile.ReadAll
    pos = InStrRev(str, vbLf)
    ReadLastLineFromTXT = Right(str, Len(str) - pos)
    If ReadLastLineFromTXT = "" Then
        Do While ReadLastLineFromTXT = ""
            pos = InStrRev(str, vbLf, pos - 1)
            ReadLastLineFromTXT = Right(str, Len(str) - pos)
            ReadLastLineFromTXT = Replace(ReadLastLineFromTXT, vbCrLf, "")
        Loop
    End If
    
    TxtFile.Close
ExitMark:
    Set TxtFile = Nothing
    Set FSO = Nothing
End Function
Изменено: New - 20.12.2022 20:11:14
Страницы: 1 2 След.
Наверх