Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

Как объединить несколько текстовых файлов в один?

Проблема сбора данных с текстовых файлов в один общий не такая распространенная, как сбор данных из нескольких файлов/листов в Excel, но все же она периодически возникает. Поэтому в этой статье просто делюсь решением, как это можно сделать при помощи не самого хитрого код. Все, что потребуется - это нажать кнопку и выбрать нужные файлы: текстовые или CSV. Далее небольшие настройки:
сначала появится запрос "Оставлять только один заголовок(первого файла)" - если указать ДА(YES), то в итоговом файле будет только один заголовок, из первого файла. Заголовки всех остальных файлов будут пропущены. Необходимо, когда в каждом из текстовых файлов есть заголовки и их включать в общий файл не требуется.
И если выбрано пропускать заголовки, то появится запрос - "Сколько строк в заголовке?". Нужно в случаях, если в текстовых файлов заголовки состоят более чем из одной строки(бывают и по 10 строк).

'---------------------------------------------------------------------------------------
' Author : Щербаков Дмитрий(The_Prist)
'          Профессиональная разработка приложений для MS Office любой сложности
'          Проведение тренингов по MS Excel
'          https://www.excel-vba.ru
'          info@excel-vba.ru
' Purpose: Процедура сбора данных с указанных текстовых файлов, оставляя только один заголовок
'---------------------------------------------------------------------------------------
Option Explicit
 
Sub GetAllTxt_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
    Dim sToSavePath, sNewLine As String
    'диалог выбора текстовых файлов. Подробнее:
    '   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
    'диалог выбора папки для сохранения файла. Подробнее:
    '   https://www.excel-vba.ru/chto-umeet-excel/dialogovoe-okno-vybora-fajlovpapki/#saveas
    sToSavePath = Application.GetSaveAsFilename( _
             InitialFileName:=ThisWorkbook.Path, _
             FileFilter:="Text files(*.txt),*.txt", _
             FilterIndex:=1, _
             Title:="Сохранить файл как")
    'если нажали Отмена - завершаем процедуру ничего не сохраняя
    If VarType(sToSavePath) = vbBoolean Then
        Exit Sub
    End If
 
    IsSkipHeader = MsgBox("Пропускать заголовки в файлах, оставив только один (из первого файла)?" & vbNewLine & _
                          vbTab & "ДА  - в итоговый файл будет записан заголовок из первого файла. Заголовки остальных файлов будут пропущены." & vbNewLine & _
                          vbTab & "НЕТ - копируются все данные всех файлов, независимо от наличия или отсутствия в них заголовков", _
                          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
            sNewLine = vbNullString
            If Right(sAllTxt, 1) <> vbLf And Right(sAllTxt, 1) <> vbCr Then
                sNewLine = vbCr
            End If
            sAllTxt = sAllTxt & sNewLine & sTxt
        End If
        'закрываем текстовый файл
        objTxtFile.Close
    Next li
    'создаем новый файл и записываем в него все считанные с файлов данные
    Set objTxtFile = objFSO.CreateTextFile(sToSavePath, True)
    objTxtFile.WriteLine sAllTxt
    objTxtFile.Close
    Set objTxtFile = Nothing
    Set objFSO = Nothing
 
    MsgBox "Данные всех файлов собраны и сохранены в файл: '" & sToSavePath & "'", vbInformation, "www.excel-vba.ru"
End Sub

Как использовать: Для начала надо убедиться, что разрешены макросы и при необходимости включить их: почему не работает макрос. Затем копируем код выше, из Excel переходим в редактор VBA(Alt+F11) -Insert -Module. Вставляем туда скопированный код. Теперь код можно вызывать нажатием клавиш Alt+F8 -выделяем имя макроса -Выполнить(Run).
Так же можно создать кнопку на листе для вызова кода: Как создать кнопку для вызова макроса на листе?.
После работы кода в выбранной папке создан новый текстовый файл(с указанным во втором диалоговом окне именем), в котором и будут содержаться данные всех выбранных файлов.
Скачать пример

  Объединить все текстовые файлы.xls (60,0 KiB, 5 949 скачиваний)

Так же см.:
Сбор данных с нескольких листов/книг
Как собрать данные с нескольких листов или книг?


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 31 комментарий
  1. Анна:

    Вот на этой строке все валится:
    sTxt = objTxtFile.ReadAll (отмечена была в дебаггере)
    Ошибка такая: Runtime error 62 Input past end of file

    P.s. У меня файлы на китайском, и их имена тоже.

  2. Скорее всего проблема именно в языке. Программа неверно определяет конец файла. Вышлите мне пару своих файлов для экспериментов и поиска решения.

  3. dana:

    Здравствуйте.
    Скачала пример. Нажимаю на кнопочку "Объединить текстовые файлы" открывается окошко с просьбой указать нужные файлы, но когда я указываю на нужные мне документы, ничего не происходит. Окошко просто закрывается, а на экране пустой лист Как быть?

  4. Зайти на диск "С" и найти там текстовый файл "AllText.txt". Это и есть файл, в котором собрана вся информация с выбранных файлов.

  5. Dima:

    Добрый день! У меня файлы формата log. Видимо из за этого возникает ошибка на строке (в третьей строке расширение заменил на log):

    Set objTxtFile = objFSO.CreateTextFile("C:/AllText.txt", True)

    В чем может быть проблема?

  6. Dima :

    Set objTxtFile = objFSO.CreateTextFile("C:/AllText.txt", True)

    В чем может быть проблема?

    Проблема очевидна. От того, что Вы меняете расширение в строке кода не меняется сама команда - она создает ТОЛЬКО ТЕКСТОВЫЕ ФАЙЛЫ. Чтобы код работал с log файлами меняйте расширение у них.

  7. Dima:

    Спасибо большое. Нашел как массово переименовывать файлы. Через Total Commander выделением нужных файлов и CTRL-M

  8. Иван Субота:

    Я хотел открыть не только файлы .txt, но и .docx. А потом все записать в .docx. Я изменил:

    avFiles = Application.GetOpenFilename("TXT Files(*.txt; *.docx),*.txt; *.docx", , , , True)

    но ничего не получилось.

  9. И не получится. docx не является разновидностью текстового файла, поэтому к нему не применимы методы, используемые в данном коде. log - является разновидностью текстовых файлов и открывается в текстовом редакторе. Именно поэтому с этим типом файлов данный метод сработал.

  10. Иван Субота:

    А что можно делать с docx?

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти