Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/75: Рейтинг темы: голосов - 75, средняя оценка - 4.57
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146

Импорт текста из txt в excel

31.08.2020, 08:17. Показов 16624. Ответов 74

Студворк — интернет-сервис помощи студентам
Здравствуйте,
Есть файл txt_01.txt, из него необходимо скопировать содержимое
Содержимое столбцами расположено, примеру так

15rt63 174asd94 39047 494 39a049 0304
157863 174394 39047 4a94 39049 0304

1a57863 1asd394 390ds47 494 390a49 0304
15d7863 174394 39047 494 39dsd049 0304

157863 17asd394 39047 494 39049 0304
157863 174d394 3904a7 494 39049 0304

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

Листая интернет, я нашел много ссылок на такие макросы, но почему то они у меня не работают. Я их слабо понимаю, и видимо одной замены расположения txt файла недостаточно, помогите :/
Спасибо
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.08.2020, 08:17
Ответы с готовыми решениями:

Импорт txt в excel
Добрый день! Есть макрос, который импортирует txt файл в excel, подскажите, пожалуйста, как изменить код, чтобы адрес импортируемого файла...

Импорт txt в excel
Добрый день! Если кто-нибудь знает, подскажите, пожалуйста, как решить данную задачу: у меня есть файл txt с колонкой чисел, нужно...

Импорт txt в Excel
Здравствуйте! Имеется txt документ. Нужен макрос, которы будет конвертировать информацию из него в следующем виде (только начиная со второй...

74
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 11:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от blackfisk Посмотреть сообщение
Workbooks.Count
Это количество загруженных книг. Туда входит и шаблон Personal, например. Не уверен, что последняя книга в списке - это именно последняя открытая.
Лучше для взаимодействия между двумя книгами оперировать не "текущей" или "активной" книгой, а при первом обращении к ним создавать объект Workbook и работать уже с ним
Например:
Visual Basic
1
2
3
4
5
6
7
8
Dim wb1 As Workbook
Dim sh1 As Worksheet
Workbooks.Open "путь к файлу"
Set wb1 = ActiveWorkbook 'мы только что открыли книгу, поэтому знаем, что активная книга - это она и есть
Set sh1 = wb1.Sheets("исх. д.")
 
sh1.Activate
sh1.Range("B13").Select
Но даже ячейки выделять всеми этими Activate и Select не стоит. Зачем эти мельтешащие анимации, которые ещё и ресурсы жрут и замедляют ход работы процедуры? Просто делать с ячейками то, что требуется, не выделяя. Выделить или активировать можно уже в конце работы процедуры, чтоб предъявить пользователю подготовленную точку начала его работы.
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 11:52  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
Это количество загруженных книг. Туда входит и шаблон Personal, например. Не уверен, что последняя книга в списке - это именно последняя открытая.
Лучше для взаимодействия между двумя книгами оперировать не "текущей" или "активной" книгой, а при первом обращении к ним создавать объект Workbook и работать уже с ним
Например:
Visual Basic
1
2
3
4
5
6
7
8
Dim wb1 As Workbook
Dim sh1 As Worksheet
Workbooks.Open "путь к файлу"
Set wb1 = ActiveWorkbook 'мы только что открыли книгу, поэтому знаем, что активная книга - это она и есть
Set sh1 = wb1.Sheets("исх. д.")
 
sh1.Activate
sh1.Range("B13").Select
Но даже ячейки выделять всеми этими Activate и Select не стоит. Зачем эти мельтешащие анимации, которые ещё и ресурсы жрут и замедляют ход работы процедуры? Просто делать с ячейками то, что требуется, не выделяя. Выделить или активировать можно уже в конце работы процедуры, чтоб предъявить пользователю подготовленную точку начала его работы.
Я не знаю, как взаимодействовать без выделений.
Set wb1
Set sh1 - это и есть без выделений?

Проблема в том, что по моей задумке, нам нужно скопировать данные с одного листа открытой книги, потом вставить в книгу из которой запустили макрос, а потом вернутся к той книге, что открыта и выбрать другой лист и т д., Данные находятся на разных листах. Поэтому я не могу использовать Activeworkbook, Ведь активная книга меняется
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 12:05
wb1 - объект книга. В моём примере - это вот та открытая книга, которую только что открыли командой
Workbooks.Open "путь к файлу"
Можно тут же открыть ещё одну книгу. Тогда она окажется активной. И мы тут же создаём ещё один объект, ссылающийся уже на неё:
Visual Basic
1
2
3
Dim wb2 As Workbook
Workbooks.Open "путь к ДРУГОМУ файлу"
Set wb2 = ActiveWorkbook
Set sh1 = wb1.Sheets("исх. д.") - это объект-ссылка на лист в первой книге. Теперь к её ячейкам можно обращаться непосредственно по этой ссылке. Например:
Visual Basic
1
sh1.Range("B13")="какое-нибудь значение"
При этом нам не обязательно в этот момент наблюдать за этой книгой, её листом, смотреть на её ячейки. Всё будет происходить как-бы в фоне. И ооооочень быстро. Без анимаций. И мы всегда уверены с каким листом какой книги работаем, а не угадываем, какая из них сейчас активна, надо ли её активировать и делать прочие такие манипуляции вслепую
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 12:15  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
wb1 - объект книга. В моём примере - это вот та открытая книга, которую только что открыли командой
Workbooks.Open "путь к файлу"
Можно тут же открыть ещё одну книгу. Тогда она окажется активной. И мы тут же создаём ещё один объект, ссылающийся уже на неё:
Visual Basic
1
2
3
Dim wb2 As Workbook
Workbooks.Open "путь к ДРУГОМУ файлу"
Set wb2 = ActiveWorkbook
Set sh1 = wb1.Sheets("исх. д.") - это объект-ссылка на лист в первой книге. Теперь к её ячейкам можно обращаться непосредственно по этой ссылке. Например:
Visual Basic
1
sh1.Range("B13")="какое-нибудь значение"
При этом нам не обязательно в этот момент наблюдать за этой книгой, её листом, смотреть на её ячейки. Всё будет происходить как-бы в фоне. И ооооочень быстро. Без анимаций. И мы всегда уверены с каким листом какой книги работаем, а не угадываем, какая из них сейчас активна, надо ли её активировать и делать прочие такие манипуляции вслепую
Не пойму, а как же мне ячейку на листе из только что открытой книги приравнять к ячейке в книге из которой я запустил макрос?
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 12:21
Если запустить запись макроса, то начнут записывать действия пользователя. А пользователь не может делать что-то с ячейкой, не щёлкнув по ней. Он же должен выбрать, с какой ячейкой хочет сделать своё дело. Поэтому в макрос и пишутся Activate и Select. А на ячейки он ссылается относительно текущего листа. Т.е.
Range("B13")="какое-нибудь значение"

Но, если мы не собираемся жонглировать листами, а для каждого нужного листа создали ссылку, то в каждом случае, когда надо обратиться к ячейке, мы явно указываем, на каком листе эта ячейка находится:
sh1.Range("B13")="какое-нибудь значение"

т.е. sh1 - это один из листов книги wb1, то и с книгой мы не ошибёмся. Если нам нужен будет лист другой книги, то для него надо иметь свою отдельную ссылку:
Set sh2 = wb2.Sheets("лист второй книги")

И потом можно значение ячейки B13 первой книги скопировать в ту же ячейку второй книги
sh2.Range("B13")=sh1.Range("B13")
Элементарно.
Но, как выше уже говорилось, удобней работать не с Range, а Cell у которой в параметрах указываются номера столбцов и строк, а не буквы. С числами проще работать в циклах.

Добавлено через 2 минуты
Если уже есть какой-то макрос, который записан макрорекордером и там не понятно, как сделать все эти ссылки - кидай сюда этот код, я адаптирую. На конкретном примере будет понятней
1
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 12:32  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
Если запустить запись макроса, то начнут записывать действия пользователя. А пользователь не может делать что-то с ячейкой, не щёлкнув по ней. Он же должен выбрать, с какой ячейкой хочет сделать своё дело. Поэтому в макрос и пишутся Activate и Select. А на ячейки он ссылается относительно текущего листа. Т.е.
Range("B13")="какое-нибудь значение"

Но, если мы не собираемся жонглировать листами, а для каждого нужного листа создали ссылку, то в каждом случае, когда надо обратиться к ячейке, мы явно указываем, на каком листе эта ячейка находится:
sh1.Range("B13")="какое-нибудь значение"

т.е. sh1 - это один из листов книги wb1, то и с книгой мы не ошибёмся. Если нам нужен будет лист другой книги, то для него надо иметь свою отдельную ссылку:
Set sh2 = wb2.Sheets("лист второй книги")

И потом можно значение ячейки B13 первой книги скопировать в ту же ячейку второй книги
sh2.Range("B13")=sh1.Range("B13")
Элементарно.
Но, как выше уже говорилось, удобней работать не с Range, а Cell у которой в параметрах указываются номера столбцов и строк, а не буквы. С числами проще работать в циклах.

Добавлено через 2 минуты
Если уже есть какой-то макрос, который записан макрорекордером и там не понятно, как сделать все эти ссылки - кидай сюда этот код, я адаптирую. На конкретном примере будет понятней
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub openfile()
 
Dim wb1 As Workbook
Dim sh1 As Worksheet
 
Dim FName As Variant
FName = Application.GetOpenFilename( _
FileFilter:="Excel Workbooks,*.xl*", _
MultiSelect:=False)
If FName <> Falce Then
Workbooks.Open Filename:=FName
End If
 
Set wb1 = ActiveWorkbook
Set sh1 = wb1.Sheets("исх. д.")
 
End Sub
Так, а если я открыл из макроса файл, с помощью такого макроса я присвою ссылки на него?
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 12:37
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub openfile()
 
Dim wb1 As Workbook
Dim sh1 As Worksheet
 
Dim FName As Variant
FName = Application.GetOpenFilename( _
    FileFilter:="Excel Workbooks,*.xl*", _
    MultiSelect:=False)
If FName <> False Then 'Falce - очепятка. Чтоб такого не было, в начале модуля надо добавить Option Explicit
    Workbooks.Open Filename:=FName
    Set wb1 = ActiveWorkbook
    Set sh1 = wb1.Sheets("исх. д.")
    'здесь пишем остальной код работы с листом. Жить wb1 и sh1 будут в пределах процедуры openfile.
End If
End Sub
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 12:58  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub openfile()
 
Dim wb1 As Workbook
Dim sh1 As Worksheet
 
Dim FName As Variant
FName = Application.GetOpenFilename( _
    FileFilter:="Excel Workbooks,*.xl*", _
    MultiSelect:=False)
If FName <> False Then 'Falce - очепятка. Чтоб такого не было, в начале модуля надо добавить Option Explicit
    Workbooks.Open Filename:=FName
    Set wb1 = ActiveWorkbook
    Set sh1 = wb1.Sheets("исх. д.")
    'здесь пишем остальной код работы с листом. Жить wb1 и sh1 будут в пределах процедуры openfile.
End If
End Sub
угу, тогда по поводу остальной части кода

Visual Basic
1
2
3
Dim LastRow As Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row '
Cells(LastRow, 1).Offset(0, 0).Select
У меня вот такой код для поиска последней заполненной ячейки, в неё то и нужно записать значения из последней открытой книги

Visual Basic
1
2
3
'.....
 
sh2.Range("B13")=""

Не совсем понимаю, как приравнять найденную ячейку в файле из которого запустили макрос с последним открывшемся с помощью ссылок
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 13:07
Вот эти все Cells предваряем ссылкой на нужный лист. Уж не знаю, какая ссылка на какой файл создана. Допустим к с листом первой книги:
LastRow = sh1.Cells(Rows.Count, 1).End(xlUp).Row

А вот это не вписывается в нашу парадигму без селектов
Cells(LastRow, 1).Offset(0, 0).Select
И ещё...
Offset(0, 0) - бессмысленная операция. Смещение на 0 строк и 0 столбцов?

Если у нас уже есть номер последней строки в переменной LastRow, то обращаться к строке выше надо через выражение
LastRow - 1
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 13:10  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
Вот эти все Cells предваряем ссылкой на нужный лист. Уж не знаю, какая ссылка на какой файл создана. Допустим к с листом первой книги:
LastRow = sh1.Cells(Rows.Count, 1).End(xlUp).Row

А вот это не вписывается в нашу парадигму без селектов
Cells(LastRow, 1).Offset(0, 0).Select
И ещё...
Offset(0, 0) - бессмысленная операция. Смещение на 0 строк и 0 столбцов?

Если у нас уже есть номер последней строки в переменной LastRow, то обращаться к строке выше надо через выражение
LastRow - 1
Я пытаюсь данные в строчку записать, как мне без offset-a?
То есть первая операция переносит в первую ячейку строки, вторая во вторую и так далее
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 13:12
Так для этого цикл нужен. Как работать с циклами, надо объяснять?
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 13:14  [ТС]
Надо получается как то передвинуться на следующую Column в этой же строке

Добавлено через 51 секунду
Цитата Сообщение от amd48 Посмотреть сообщение
Так для этого цикл нужен. Как работать с циклами, надо объяснять?
я почти ноль в VBA, не знаю, как работать с циклами :c
0
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
02.09.2020, 13:18
Цитата Сообщение от blackfisk Посмотреть сообщение
не знаю, как работать с циклами
Беда. Тогда надо сначала изучить теорию про For ... Next (For Each тоже), While ... Wend
Ну или выкладывать сюда образцы обоих файлов и подробное объяснение, какие ячейки и куда копировать по какому принципу. Кому будет не лень - напишет процедуру копирования полностью под эти хотелки. А так на каждую строку кода чатиться по целой странице - бестолковое занятие
0
Нет, ну ты видел?!
8 / 8 / 0
Регистрация: 21.05.2020
Сообщений: 146
02.09.2020, 13:26  [ТС]
Цитата Сообщение от amd48 Посмотреть сообщение
Беда. Тогда надо сначала изучить теорию про For ... Next (For Each тоже), While ... Wend
Ну или выкладывать сюда образцы обоих файлов и подробное объяснение, какие ячейки и куда копировать по какому принципу. Кому будет не лень - напишет процедуру копирования полностью под эти хотелки. А так на каждую строку кода чатиться по целой странице - бестолковое занятие
Спасибо еще раз
0
 Аватар для Святой НякаЛайк
655 / 247 / 89
Регистрация: 28.10.2015
Сообщений: 526
05.09.2020, 13:53
blackfisk, А почему не воспользоваться "Данные - Импорт - Из текста"?

Если именно VBA нужно, то под ваши файлы макрорекордер дал такой код

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
30
Sub Макрос2()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\Users\Magic\Desktop\txt3.txt", Destination:=Range("$A$1"))
        .Name = "txt3"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileDecimalSeparator = "."
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
Это на мой взгляд самое простое решение, к тому же остается связь с файлом в виде подключения к данным - можно обновлять таблицу одним нажатием кнопки сколько угодно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.09.2020, 13:53
Помогаю со студенческими работами здесь

Импорт из Excel или Txt в БД Лотус
Вроде тема поднимлась так или иначе, но то что нужно не нашла. Пожалуйста, поделитесь скриптом, который может имортировать файл Excel...

Импорт текста из буфера обмена в таблицу Excel
Доброго здоровья всем! :), Нужна ваша помощь. Делаю экспорт данных из программы через буфер обмена. Текст в буфере выглядит примерно так; ...

Импорт из Excel длинного текста (более 255 символов)
Добрый день ув. форумчане! Вопрос по импорту длинного текста из Excel. Опишу с чем столкнулся, возможно кому то время сэкономит. Детектив...

Чтение текста в Юникоде из txt файла в столбец Excel 2010
В общем пытаюсь прочесть, но корректно (без кракозябр) получается только первая строка. Винда английская. Sub ReadTextFile() Dim...

Поиск определенного текста в файле .txt и вставка в определенную ячейку в Excel
Доброго времени суток. Допустим есть файл info.txt ( состоит из множества строк, например gsd = 797 .... dig = 7666 и т.д.) в корне в с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru