Страницы: 1
RSS
Перенести данные из нескольких файлов в один файл
 
Есть несколько файлов ексель. Структура всех файлов одинаковая.
В каждом файле 7 листов с одинаковым названием, вот такие:

на каждом листе таблицы с разными данными. Названия столбцов у таблицах во всех файлах на листах также одинаковые.

Нужно со всех файлов с каждого листа перенести данные из таблиц в один файл. То есть берем заголовок столбцов с одного файла и просто переносим данные все со всех файлов с каждой таблицы друг под другом.

Нашел макрос который переносит со всех файлов данные в один файл, но он просто копирует листы целиком, а не обьеденяет данные с листов с одинаковым названием на одном листе. Может можно код этого макроса подправить, чтобы он не копировал листы, а просто переносил все данные в один лист по названию листа.
Вот код макроса:
Код
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Workbooks.Open Filename:=FilesToOpen(x)
        Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Заранее благодарен за помощь.
 
Кажется проще реализовать это с помощью Power Query.
https://www.planetaexcel.ru/techniques/12/2152/
 
Мне кажется, что вариант с макросом намного проще... Да и в примере что вы скинули там только с одного листа данные собираются... А у меня в каждом файле 7 листов... ((
 
Добрый вечер.
Вот кстати в свете этих глюков форума поискал свой самый первый пост, и он оказался примерно в тему:
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=8&TID=12390&TITLE_SEO=12390&MID=101361#message101361
Там только вместо строки
Код
wb.Sheets(1).[aj2] = wb.Sheets(1).[aj2].Value + xls.Sheets(1).[aj2].Value

поставить цикл по листам и копирование диапазонов в первую свободную строку.
 
Спасибо за ответ. К сожалению, я не знаю ни как добавить цикл по листам, ни как добавить копирование диапазонов... :(  
 
Кто-то знает как поставить цикл по листам и копирование диапазонов в первую свободную строку, как посоветовал сделать Hugo? Как в итоге должен выглядеть макрос?  
 
Код
Sub CombineWorkbooks()
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Sheets(1) 'вместо 1, можно указать "Лист1" например
    Dim wb1 As Workbook
    Dim ws1 As Worksheet
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
                  (FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", _
                   MultiSelect:=True, Title:="Files to Merge")
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        GoTo ExitHandler
    End If
    x = 1
    While x <= UBound(FilesToOpen)
        Set wb1 = Workbooks.Open(Filename:=FilesToOpen(x)) 'присвоение на переменную объекта открываемой книги
        For Each ws1 In wb1.Worksheets 'перебор листов в открываемой книге
            i = ws.Cells(Rows.Count, 1).End(xlUp).Row 'последняя строка по 1 столбцу в этой книге
            i1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row 'последняя строка по 1 столбцу в открываемой книге книге
            If i1 > 1 Then 'если на листе есть чтото кроме шапки
                ws1.Rows("2:" & i1).Copy ws.Cells(i + 1, 1) 'вставить вместе с формулами
            End If
        Next ws1
        x = x + 1
    Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
 
CrazyRabbit, спасибо за ответ. Попробовал Ваш макрос. Не совсем тот результат получился что нужно...

Макрос со всех 7 листов с каждого документа перенес данные в один лист и получилась каша. Вот такая

Как я и писал, нужно чтобы в итоговом файле также было 7 листов, как в каждом документе, с теми же названиями, только чтобы данные со всех документов объединились бы на каждом листе.
 
realmen80, Добрый день.
Посмотрите ЗДЕСЬ
 
Цитата
msi2102 написал:
realmen80 , Добрый день.Посмотрите  ЗДЕСЬ
Спасибо. Этот макрос я видел и пробовал. Он делает то же самое что и макрос код которого я привел в первом сообщении... Он просто переносит листы со всех документов в Итоговый документ, но не обьеденяет данные... Просто копирует листы... Вот так
 
realmen80, сегодня время нет, если до завтра никто не поможет то посмотрю
 
Цитата
msi2102 написал:
realmen80 , сегодня время нет, если до завтра никто не поможет то посмотрю
Спасибо
 
Появилась минутка, объединил Вам два макроса ОТСЮДА и ОТСЮДА
Изменено: msi2102 - 04.08.2020 14:26:51
 
Цитата
msi2102 написал:
Появилась минутка, объединил Вам два макроса  ОТСЮДА  и  ОТСЮДА
Спасибо. У меня после выбора файлов для обработки появилась ошибка

Если нажать Debug то вот что пишет


Также не могу понять почему вместо русских букв - знаки вопросов стали...
 
Попробуйте так
Код
Sub CombineWorkbooks()
    Dim FilesToOpen, ws As Worksheet, LastRow As Long, rngData As Range, x As Long
    
    Set wbReport = ThisWorkbook
    Application.ScreenUpdating = False  'отключаем обновление экрана для скорости
    
    'вызываем диалог выбора файлов для импорта
    FilesToOpen = Application.GetOpenFilename _
        (FileFilter:="All files (*.*), *.*", _
        MultiSelect:=True, Title:="Files to Merge")
 
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "Не выбрано ни одного файла!"
        Exit Sub
    End If
     
    'проходим по всем выбранным файлам
    For x = 1 To UBound(FilesToOpen)
        Set importWB = Workbooks.Open(Filename:=FilesToOpen(x), ReadOnly:=True)
        For Each ws In importWB.Worksheets
            'определяем номер последней строки на текущем листе и на листе сборки
            LastRow = wbReport.Worksheets(ws.Name).Range("A1").CurrentRegion.Rows.Count
            Set rngData = ws.Range("A2", ws.Range("A2").SpecialCells(xlCellTypeLastCell))    'от А2 и до конца листа
            'копируем исходный диапазон и вставляем в итоговую книгу со следующей строки
            rngData.Copy Destination:=wbReport.Worksheets(ws.Name).Cells(LastRow + 1, 1)
        Next ws
        importWB.Close savechanges:=False
    Next x
    Application.ScreenUpdating = True
End Sub
 
Цитата
New написал:
Попробуйте так
Теперь такая ошибка:
 
Цитата
realmen80 написал:
Также не могу понять почему вместо русских букв - знаки вопросов стали...
- нужно копировать код при русской раскладке.
 
realmen80, а у вас на всех листах данные начинаются с ячейки А1? Или на каком-то листе данные начинаются ниже первой строки?
У меня мой файл, который во вложении, нормально работает с вашими файлами 1, 2, 3
Изменено: New - 04.08.2020 15:20:47
 
Цитата
New написал:
realmen80 , а у вас на всех листах данные начинаются с ячейки А1? Или на каком-то листе данные начинаются ниже первой строки?У меня мой файл, который во вложении, нормально работает с вашими файлами 1, 2, 3
Файл во вложении и у меня сработал. На всех листах данные начинаются с ячейки А1.

Как я понял, проблема была в том, что я вставлял код макроса в новом документе и запускал макрос. При этом в новом файле не было 7 листов и заголовков в столбцах с данными.

Получается, что нужно чтобы предварительно были созданы все 7 листов с таким же названием и с такими же заголовками столбцов? Если будет отличаться хоть одна буква в названии, то уже ничего работать не будет?

Это я к тому, что если будут документы с другим названием листов или листов будет не 7, а 6 - например, то уже не будет макрос работать? Может в макросе можно прописать чтобы он не привязывался к названиям листов и названиям столбцов с данными, а чтобы просто копировал названия которые будут.

Тогда это будет универсальный код макроса, который можно будет применять для объединения данных с нескольких документов с любым количеством листов, не зависимо от их названия...
 
realmen80, Количество и названия листов должны совпадать в файле Результат и в остальных файлах, макрос не создает новые листы, вставляет уже в  существующие
Изменено: msi2102 - 04.08.2020 16:00:26
 
1. в файле с макросом нужно, чтобы были все 7 листов и желательно с заголовками таблицы, иначе не будет заголовков на листах
2. Да, названия листов должны совпадать в файле с макросом и в файлах откуда копируем.

3. Да, если будет отличаться хоть одна буква в названии листа макрос уже не скопирует данные (скорее выдаст ошибку, что в файле с макросом такого листа нет)
4. Кол-во листов не важно, хоть 100, главное, чтобы названия листов в файле с макросом и в файлах, откуда копируем было одинаково и названия были одинаковы
5. макрос не привязывается к названиям столбцов и к названию листов - но важно, чтобы они все одинаково назывались в файле с макросом и в файлах откуда берём

P.S. А как вы хотите, чтобы макрос брал данные из листа "Послезавтра" и копировал данные на лист "Страны"? В макросе надо точно указывать на какой лист копируем данные
Цитата
realmen80 написал:
Это  я к тому, что если будут документы с другим названием листов или листов  будет не 7, а 6 - например, то уже не будет макрос работать?
если названия листов в файле с макросом будут совпадать с названиями листов в файлах, то ничего переделывать не нужно.
Например, добавьте в файл с макросом лист "Проверка" и такой же лист добавьте во все 3 файла и запустите макрос - макрос нормально отработает
Изменено: New - 04.08.2020 16:04:04
 
Цитата
msi2102 написал:
realmen80 , Количество и названия листов должны совпадать в файле Результат и в остальных файлах, макрос не создает новые листы, вставляет уже в  существующие
То есть названия листов и их количество может быть любым, главное чтобы названия и количество листов совпадали бы в файле Результат и в файлах данные с которых нужно объединить?
 
Да, для проверки, добавьте в файл с макросом лист "Проверка" и такой же лист  добавьте во все 3 файла и запустите макрос - макрос нормально отработает

Цитата
realmen80 написал:
главное чтобы названия и количество листов совпадали бы в файле Результат и в файлах данные с которых нужно объединить?
да
Изменено: New - 04.08.2020 16:06:12
 
Понял. Спасибо всем за помощь и ответы
 
Тогда так:
Изменил название одного листа, не найдя такого названия копируется новый лист
Изменено: msi2102 - 04.08.2020 16:36:23
Страницы: 1
Наверх