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

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

31.08.2020, 08:17. Показов 17507. Ответов 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,267
Записей в блоге: 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,267
Записей в блоге: 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,267
Записей в блоге: 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,267
Записей в блоге: 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,267
Записей в блоге: 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,267
Записей в блоге: 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,267
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru