Lost your password?


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

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

Проблема сбора данных с текстовых файлов в один общий не такая распространенная, как сбор данных из нескольких файлов/листов в 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 774 скачиваний)

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


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

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

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 Яндекс.Метрика
© 2022 Excel для всех   Войти