Хитрости »
22 Май 2011 60286 просмотров
Как объединить несколько текстовых файлов в один?
Проблема сбора данных с текстовых файлов в один общий не такая распространенная, как сбор данных из нескольких файлов/листов в Excel, но все же она периодически возникает. Поэтому в этой статье просто делюсь решением, как это можно сделать при помощи не самого хитрого код. Все, что потребуется — это нажать кнопку и выбрать нужные файлы: текстовые или CSV. Далее небольшие настройки:
сначала появится запрос «Оставлять только один заголовок(первого файла)» — если указать ДА(YES), то в итоговом файле будет только один заголовок, из первого файла. Заголовки всех остальных файлов будут пропущены. Необходимо, когда в каждом из текстовых файлов есть заголовки и их включать в общий файл не требуется.
И если выбрано пропускать заголовки, то появится запрос — «Сколько строк в заголовке?». Нужно в случаях, если в текстовых файлов заголовки состоят более чем из одной строки(бывают и по 10 строк).
'--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' Профессиональная разработка приложений для MS Office любой сложности ' Проведение тренингов по MS Excel ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Процедура сбора данных с указанных текстовых файлов, оставляя только один заголовок '--------------------------------------------------------------------------------------- Option Explicit Sub Get_All_TXT_SkipHeader() Dim avFiles, li As Long, lHeadLinesCount As Long, lh As Long Dim objFSO As Object, objTxtFile As Object, sTxt, sAllTxt Dim IsSkipHeader As Boolean 'диалог выбора текстовых файлов. Подробнее: ' https://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/ avFiles = Application.GetOpenFilename("TXT files(*.txt),*.txt,CSV files(*.csv),*.csv", , , , True) If VarType(avFiles) = vbBoolean Then Exit Sub IsSkipHeader = MsgBox("Оставлять только один заголовок(первого файла)?", vbQuestion + vbYesNo, "www.excel-vba.ru") = vbYes If IsSkipHeader Then lHeadLinesCount = Val(InputBox("Сколько строк в заголовке?", "www.excel-vba.ru", 1)) End If Set objFSO = CreateObject("Scripting.FileSystemObject") For li = LBound(avFiles) To UBound(avFiles) 'открываем текстовый файл Set objTxtFile = objFSO.OpenTextFile(avFiles(li), 1) 'если заголовок уже записан и указано оставлять только один заголовок 'пропускаем строки заголовков для 2-го и последующих файлов If IsSkipHeader Then If li > LBound(avFiles) Then For lh = 1 To lHeadLinesCount objTxtFile.skipline Next End If End If 'считываем все данные файла sTxt = objTxtFile.ReadAll If sAllTxt = "" Then sAllTxt = sTxt Else sAllTxt = sAllTxt & sTxt End If 'закрываем текстовый файл objTxtFile.Close Next li 'создаем новый файл и записываем в него все считанные с файлов данные Set objTxtFile = objFSO.CreateTextFile("C:AllText.txt", True) objTxtFile.WriteLine sAllTxt objTxtFile.Close Set objTxtFile = Nothing Set objFSO = Nothing End Sub
Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, из Excel переходим в редактор VBA(Alt+F11) —Insert —Module. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt+F8 -выделяем имя макроса —Выполнить(Run).
Так же можно создать кнопку на листе для вызова кода: Как создать кнопку для вызова макроса на листе?.
После работы кода на диске «С» будет создан файл «AllText.txt», в котором и будут содержаться данные всех выбранных файлов.
Скачать пример
Объединить все текстовые файлы.xls (55,0 KiB, 5 825 скачиваний)
Так же см.:
Сбор данных с нескольких листов/книг
Как собрать данные с нескольких листов или книг?
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Господа,
Всех с наступающим НГ! Удачи, счастья и сбычи мечт.
Возник такой вопрос. Есть n количество файлов с данными в формате .txt
Формат данных одинаковый: одинаковая шапка в документе, одинаковое кол-во столбцов, разделитель значений один и тот же (точка с запятой).
До сих пор я их переношу в excel путем импорта каждого файлика и использованием опции «текст по столбцам».
Вопрос: существует ли возможность написать макрос, который позволял бы собирать эти файлы вместе, обрезать шапочку и конвертировать все их в один лист Excel? Файлы могут лежать в разных папках….
Начинаю писать макрос
Sub CombineWorkbooks()
Dim FilesToOpen
On Error GoTo ErrHandler
Application.ScreenUpdating = False
FilesToOpen = Application.GetOpenFilename _
(FileFilter:=»Text files (*.txt), _
MultiSelect:=True)
Ругается. (чайник я…) И потом, а как дальше прописать, чтобы он выполнял необходимые разделения и объединял файлы.
Пример во вложении (текстовые файлы и целевой результат)
Может, кто поможет?
Skip to content
Мы рассмотрим три способа объединения файлов Excel в один: путем копирования листов, запуска макроса VBA и использования инструмента «Копировать рабочие листы» из надстройки Ultimate Suite.
Намного проще обрабатывать данные в одном файле, чем переключаться между многочисленными книгами. Однако объединение нескольких книг Excel в один файл может быть сложным и долгим процессом, особенно если книги, которые вам нужно объединить, содержат много листов. Итак, как подойти к этой проблеме? Вы будете копировать их вручную или с помощью кода VBA? Или вы используете один из специализированных инструментов для объединения файлов Excel?
Ниже вы найдете несколько хороших способов, позволяющих реализовать объединение.
- Самое простое — копировать вручную.
- Объединение файлов Excel при помощи VBA.
- Как объединить несколько файлов с помощью Ultimate Suite.
Примечание. В этой статье мы рассмотрим, как копировать листы из нескольких книг Excel в одну книгу. Если вы ищете быстрый способ скопировать данные с нескольких листов на один общий лист, вы найдете подробную инструкцию в другой статье: Как объединить несколько листов в один.
Простой метод — копировать листы руками.
Если вам нужно объединить всего пару файлов Excel, вы можете вручную скопировать или переместить листы из одного файла в другой. Вот как это можно сделать:
- Откройте книги, которые мы планируем объединить.
- Выберите листы в исходной книге, которые вы хотите скопировать в основную книгу.
Чтобы выбрать несколько листов, используйте один из следующих приемов:
- Чтобы выбрать соседние листы, щелкните вкладку первого, который вы хотите скопировать, нажмите и удерживайте клавишу Shift, а затем щелкните вкладку последнего. Это действие выберет все листы между ними.
- Чтобы выбрать несмежные, удерживайте клавишу Ctrl и щелкайте вкладку каждого из них по отдельности.
- Выделив все нужные листы, щелкните правой кнопкой мыши любую из выделенных вкладок и выберите «Переместить» или «Копировать…» .
- В диалоговом окне «Перемещение или копирование» выполните следующие действия:
- В раскрывающемся списке «Переместить выбранные листы в книгу» выберите целевую книгу, в которую вы хотите объединить другие файлы.
- Укажите, где именно должны быть вставлены вкладки. В нашем случае мы выбираем вариант вставки в конец списка.
- Установите флажок «Создать копию», если хотите, чтобы исходные данные оставались оригинальном файле.
- Нажмите
ОК
, чтобы завершить операцию.
Чтобы объединить вкладки из нескольких файлов Excel, повторите описанные выше шаги для каждой книги отдельно.
Замечание. При копировании листов вручную помните о следующем ограничении, налагаемом Excel: невозможно переместить или скопировать группу листов, если какой-либо из них содержит «умную» таблицу. В этом случае вам придется либо преобразовать таблицу в диапазон, либо использовать один из других методов, не имеющих этого ограничения.
Как объединить файлы Excel с VBA
Если у вас есть несколько файлов Excel, которые необходимо объединить в один файл, более быстрым способом будет автоматизировать процесс с помощью макроса VBA.
Ниже вы найдете код VBA, который копирует все листы из всех файлов Excel, которые вы выбираете, в одну книгу. Этот макрос MergeExcelFiles написан Алексом.
Важное замечание! Макрос работает со следующим ограничением — объединяемые файлы не должны быть открыты физически или находиться в памяти, в буфере обмена. В таком случае вы получите ошибку во время выполнения.
Sub MergeExcelFiles()
Dim fnameList, fnameCurFile As Variant
Dim countFiles, countSheets As Integer
Dim wksCurSheet As Worksheet
Dim wbkCurBook, wbkSrcBook As Workbook
fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)
If (vbBoolean <> VarType(fnameList)) Then
If (UBound(fnameList) > 0) Then
countFiles = 0
countSheets = 0
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set wbkCurBook = ActiveWorkbook
For Each fnameCurFile In fnameList
countFiles = countFiles + 1
Set wbkSrcBook = Workbooks.Open(Filename:=fnameCurFile)
For Each wksCurSheet In wbkSrcBook.Sheets
countSheets = countSheets + 1
wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
Next
wbkSrcBook.Close SaveChanges:=False
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Processed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
End If
Else
MsgBox "No files selected", Title:="Merge Excel files"
End If
End Sub
Как добавить этот макрос в книгу
Если вы хотите вставить макрос в свою книгу, выполните следующие обычные действия:
- нажимать
Alt + F11
, чтобы открыть редактор Visual Basic. - Щелкните правой кнопкой мыши ThisWorkbook на левой панели и выберите « Вставить» > « Модуль» в контекстном меню.
- В появившемся окне (Окно кода) вставьте указанный выше код.
Более подробная инструкция описана в разделе Как вставить и запустить код VBA в Excel .
Кроме того, вы можете загрузить макрос в файле Excel, открыть его в этой книге (включить выполнение макросов, если будет предложено), а затем переключиться на свою собственную книгу и нажать Alt + F8
для его запуска. Если вы новичок в использовании макросов в Excel, следуйте подробным инструкциям ниже.
Как использовать макрос MergeExcelFiles
Откройте файл Excel, в котором вы хотите объединить листы из других книг, и выполните следующие действия:
- Нажмите комбинацию
Alt + F8
, чтобы открыть окно диалога. - В разделе « Имя макроса» выберите MergeExcelFiles и нажмите «Выполнить».
- Откроется стандартное окно проводника, вы выберите одну или несколько книг, которые хотите объединить, и нажмите «Открыть» . Чтобы выбрать несколько файлов , удерживайте нажатой клавишу Ctrl, указывая на их имена.
В зависимости от того, сколько файлов вы выбрали, дайте макросу несколько секунд или минут для их обработки. После завершения всех операций он сообщит вам, сколько файлов было обработано и сколько листов было объединено:
Как объединить несколько файлов с помощью Ultimate Suite.
Если вам не очень комфортно с VBA и вы ищете более простой и быстрый способ объединить файлы Excel, обратите внимание на инструмент «Копирование листов (Copy Sheets)» — одну из более чем 60 функций, включенных в невероятно функциональную программу Ultimate Suite for Excel. Она работает в версиях Excel 2010-2019.
С Ultimate Suite объединение нескольких файлов Эксель в один так же просто, как раз-два-три (буквально, всего 3 быстрых шага). Вам даже не нужно открывать те из них, которые вы хотите объединить. И это могут быть два файла или несколько — не важно.
- Открыв главную книгу, перейдите на вкладку «Ablebits Data» и нажмите «Копировать листы (Copy Sheets)» > «Выбранные в одну книгу (Selected Sheets to one workbook)».
- В диалоговом окне выберите файлы (а в них — листы), которые вы хотите объединить, и нажмите «Далее (Next)» .
Советы:
- Чтобы выбрать все листы в определенной книге, просто поставьте галочку в поле рядом с именем книги, и все они в этом файле будут выбраны автоматически.
- Чтобы объединить листы из закрытых книг, нажмите кнопку «Добавить файлы…» и выберите столько книг, сколько нужно. Это добавит выбранные файлы только в окно копирования, не открывая их в Excel.
- По умолчанию копируются все данные. Однако, в разных листах можно выбрать разные диапазоны для объединения. Чтобы скопировать только определенную область, наведите указатель мыши на имя вкладки, затем щелкните значок и выберите нужный диапазон.
- При необходимости укажите один или несколько дополнительных параметров и нажмите «Копировать» . На снимке скриншоте а ниже показаны настройки по умолчанию: Вставить все (формулы и значения) и Сохранить форматирование.
Дайте мастеру копирования листов несколько секунд для обработки и наслаждайтесь результатом!
На этой странице есть подробное описание всех возможностей работы мастера копирования.
Чтобы поближе познакомиться с этим и другими инструментами для Excel, вы можете загрузить ознакомительную версию Ultimate Suite.
Итак, я надеюсь, вы получили ответ на вопрос — как быстро объединить несколько файлов Excel в один.
0 / 0 / 0 Регистрация: 06.12.2011 Сообщений: 9 |
|
1 |
|
Собрать данные из нескольких документов в один12.12.2012, 16:39. Показов 22495. Ответов 20
Доброго времени суток, я сам начинающий, и у меня вопрос, как сделать обработку, например бат файл, чтобы он собирал все файлы в один, или указываешь на какой то определенный каталог(папку) и он берет из нее EXCEL файлы и собирает в один EXCEL — файл.Заранее спасибо!
0 |
5468 / 1148 / 50 Регистрация: 15.09.2012 Сообщений: 3,514 |
|
12.12.2012, 17:06 |
2 |
Новичёк1000000, сначала нужно уточнить:
0 |
Новичёк1000000 0 / 0 / 0 Регистрация: 06.12.2011 Сообщений: 9 |
||||
13.12.2012, 09:34 [ТС] |
3 |
|||
Скрипт, я думаю макрос с этим справится, если его написать на VBA, похожий нашел, но необходимо немного изменить под требования
(она работает, только листы добавляет, а надо чтобы все в один писала)
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
14.12.2012, 10:05 |
4 |
|||
Приведу свой код 2007 года с другого форума.
1 |
0 / 0 / 0 Регистрация: 21.01.2013 Сообщений: 5 |
|
15.05.2013, 14:53 |
5 |
Добавлено через 1 минуту А если необходимо объединить два и более текстовых документа doc в один конечный doc. Эту процедуру запускать из БД access в форме по нажатию кнопки. Пути нахождения документов известны. Конечный документ создается или можно в ранее созданный документ.
0 |
undefined7 259 / 7 / 1 Регистрация: 22.01.2013 Сообщений: 47 |
||||||
15.05.2013, 21:04 |
6 |
|||||
я пользуюсь прикреплённым макросом.
Вложения
2 |
4 / 4 / 0 Регистрация: 18.07.2014 Сообщений: 14 |
|
18.07.2014, 14:50 |
7 |
Добрый день! Могли бы подсказать, а есть ли аналогичный макрос, только для документов Word, а именно: есть папка с документами, в открытый документ скопировать надпись или строку таблицы из всех документов в этой папке (желательно не открывая документы в папке). Спасибо!
0 |
0 / 0 / 0 Регистрация: 23.11.2013 Сообщений: 3 |
|
15.11.2014, 17:28 |
8 |
Здравствуйте! Очень прошу помочь.
0 |
Irbtim 0 / 0 / 0 Регистрация: 13.11.2014 Сообщений: 13 |
||||
25.03.2015, 13:01 |
9 |
|||
Всем Доброго дня,
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
25.03.2015, 13:12 |
10 |
Определяете в чём эта неидентичность и как её кодом опознать, для каждой пишите свой вариант обработки.
0 |
0 / 0 / 0 Регистрация: 13.11.2014 Сообщений: 13 |
|
25.03.2015, 14:43 |
11 |
В ексель файлах информация находится не одинакова в одних и тех же ячейках, могуть быть выше на строчку, или ниже
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
25.03.2015, 16:30 |
12 |
И чем этот код не годится? Только не повторяйтесь
0 |
Irbtim 0 / 0 / 0 Регистрация: 13.11.2014 Сообщений: 13 |
||||
25.03.2015, 16:43 |
13 |
|||
Друзья,
0 |
Burnoutman 7 / 7 / 4 Регистрация: 05.04.2012 Сообщений: 147 |
||||
02.08.2019, 21:08 |
14 |
|||
Приведу свой код 2007 года с другого форума.
Код отличный,если Запустить в Visual Basic из под Excel,то всё работает,но когда сохраняю в notepad++ в .vbs выдаёт ошибку: Миниатюры
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
02.08.2019, 23:40 |
15 |
Насколько помню — в vbs нет типов переменных.
0 |
Burnoutman 7 / 7 / 4 Регистрация: 05.04.2012 Сообщений: 147 |
||||
03.08.2019, 00:15 |
16 |
|||
Насколько помню — в vbs нет типов переменных.
Строка:14
0 |
7 / 7 / 4 Регистрация: 05.04.2012 Сообщений: 147 |
|
03.08.2019, 09:10 |
17 |
Пофиг на этот vbs. Как изменить код так, чтобы информация сохранялась в этот же файл excel из которого запускается макрос, а не предлагала сохранить в новый?
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
03.08.2019, 20:08 |
18 |
|||
строка 15:
Ну и после строки 44 до строки 56 всё удалить. Можно дописать сохранение wbTarget, а можно и не дописывать. сохранить вручную если нужно.
1 |
0 / 0 / 0 Регистрация: 01.09.2020 Сообщений: 11 |
|
13.04.2022, 13:46 |
19 |
Здравствуйте.
0 |
811 / 465 / 181 Регистрация: 09.03.2009 Сообщений: 1,579 |
|
13.04.2022, 20:43 |
20 |
Сделать цикл Dir или FSO.
0 |
К примеру, есть у вас несколько десятков (или сотен) текстовых файлов с подобным содержимым:
(количество файлов, и количество строк данных в каждом файле не ограничено)
1c04;1J0-698-151-G;1 комплект тормозных накладок;1J0698151G;1J0698151G;5;1
1c04;1H0698151A;Тормозные колодки;1H0698151A;1H0698151A;1;1
1c04;1K0-698-151-B;Тормозные колодки;1K0698151B;1K0698151B;2;1
А надо из всего этого сформировать табличку в Excel — приблизительно такого вида:
На помощь придёт функция DATfolder2Array
Sub ПримерИспользованияФункции_DATfolder2Array() Папка = "D:ПроектыDATs" ' папка, в которой будет производиться поиск файлов DAT для обработки Dim ErrorsArray ' пустой массив для ошибок ' считываем данные из все файлов .DAT в папке в двумерный массив DataArr = DATfolder2Array(Папка, 7, "1,2,4,5", ErrorsArray) ' результаты выводим на листы "errors" и "result" (они должны существовать) Array2worksheet Worksheets("errors"), ErrorsArray, _ Array("Имя файла", "Номер строки", "Данные из строки") Array2worksheet Worksheets("result"), DataArr, _ Array("Ячейка", "Штрих-Код", "Наименование", "код 1С", "код произв.", "кол-во", "счетовод") End Sub
Код функции DATfolder2Array:
Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _ ByVal TextColumns$, ByRef ErrorsArr) As Variant ' получает путь FolderPath$ к папке с DAT-файлами ' считывает из файлов все строки, в которых число записей в строке равно ColumnsCount ' остальные (неподходящие) строки отправляет в массив ErrorsArr ' (столбцы ErrorsArr: 1-имя файла, 2 - номер строки, 3 - данные) ' в переменной TextColumns$ через запятую перечислены номера ТЕКСТОВЫХ столбцов ' Возвращает двумерный массив размером N*ColumnsCount ReDim ErrorsArr(1 To 1000, 1 To ColumnsCount + 2) On Error Resume Next Dim coll As New Collection, filename filename = Dir(FolderPath$ & "*.dat") While filename <> "" coll.Add filename ' считываем в колекцию coll нужные имена файлов filename = Dir Wend Dim newtxt As String, ro As String, errIndex As Long For Each filename In coll Application.StatusBar = "Обрабатывается файл: " & filename newtxt = ReadTXTfile(FolderPath$ & filename) tempArr = "": tempArr = Split(newtxt, vbNewLine) For i = LBound(tempArr) To UBound(tempArr) ro = tempArr(i): ro = Replace(ro, vbTab, ";") If UBound(Split(ro, ";")) <> ColumnsCount - 1 And Len(Trim(ro)) > 0 Then tempArr(i) = "": errIndex = errIndex + 1 ErrorsArr(errIndex, 1) = filename ErrorsArr(errIndex, 2) = "Строка " & i + 1 ErrorsArr(errIndex, 3) = ro End If Next i newtxt = Join(tempArr, vbNewLine) txt = txt & newtxt & vbNewLine: DoEvents Next While InStr(1, txt, vbNewLine & vbNewLine) > 0 txt = Replace(txt, vbNewLine & vbNewLine, vbNewLine) Wend txt = Replace(txt, vbTab, ";"): tempArr = Split(txt, vbNewLine) ReDim newArr(1 To UBound(tempArr), 1 To ColumnsCount) For i = LBound(tempArr) To UBound(tempArr) roArr = "": roArr = Split(tempArr(i), ";") For j = 1 To ColumnsCount newArr(i + 1, j) = roArr(j - 1) If "," & TextColumns$ & "," Like "*," & j & ",*" Then newArr(i + 1, j) = "'" & newArr(i + 1, j) End If Next j Next i DATfolder2Array = newArr Application.StatusBar = False End Function
Код вспомогательной функции Array2worksheet можно найти на странице http://excelvba.ru/code/Array2worksheet