Сборка листов из разных книг в одну
Предположим, имеется куча книг Excel, все листы из которых надо объединить в один файл. Копировать руками долго и мучительно, поэтому имеет смысл использовать несложный макрос.
Открываем книгу, куда хотим собрать листы из других файлов, входим в редактор Visual Basic сочетанием клавиш Alt+F11 одноименной кнопкой на вкладке Разработчик (Developer - Visual Basic), добавляем новый пустой модуль (в меню Insert - Module) и копируем туда текст вот такого макроса:
Sub CombineWorkbooks()
Dim FilesToOpen
Dim x As Integer
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
'проходим по всем выбранным файлам
x = 1
While x <= UBound(FilesToOpen)
Set importWB = Workbooks.Open(Filename:=FilesToOpen(x))
Sheets().Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
importWB.Close savechanges:=False
x = x + 1
Wend
Application.ScreenUpdating = True
End Sub
После этого можно вернуться в Excel и запустить созданный макрос на вкладке Разработчик кнопкой Макросы (Developer - Macros) или нажав Alt+F8. Отобразится диалоговое окно открытия файла, где необходимо указать один или несколько (удерживая Ctrl или Shift) файлов, листы из которых надо добавить к текущей книге - и задача решена!
Ссылки по теме
- Что такое макросы, куда вставлять код макроса на Visual Basic
- Автоматическая сборка заданных листов из заданных книг с помощью надстройки PLEX
- Автоматическая сборка данных с нескольких листов на один итоговый лист с помощью надстройки PLEX
Пока правда других способов не знаю.
Спасибо.
У меня при копировании листов с книг разных версий екселя работает только Ваш макрос, однако когда я хочу скопировать только первый лист с разных книг, я указал следующий код:
wbk2.Sheets().Move After:=wbk.Sheets(wbk.Sheets.Count)открываются все книги, из которых эти листы копировались.
Вопрос: можно ли изменить код таким образом, чтобы всё работало по прежней схеме, но при этом куча книг не открывалась и я указывал номер листа какой хочу?
поменял девятую строку из макроса в оригинальном посте - файлы появились, работает
Sub Сбор_листов_в_один_файл() Const strStartDir = "c:\test" 'папка, с которой начать обзор файлов Const strSaveDir = "c:\test\result" 'папка, в которую будет предложено сохранить результат Dim wbTarget As New Workbook, wbSrc As Workbook, shSrc As Worksheet, shTarget As Worksheet, arFiles, _ i As Integer, stbar As Boolean On Error Resume Next 'если указанный путь не существует, обзор начнется с пути по умолчанию ChDir strStartDir On Error GoTo 0 With Application 'меньше писанины arFiles = .GetOpenFilename("Excel Files (*.xls), *.xls", , "Объединить файлы", , True) If Not IsArray(arFiles) Then End 'если не выбрано ни одного файла Set wbTarget = Workbooks.Add(template:=xlWorksheet) .ScreenUpdating = False stbar = .DisplayStatusBar .DisplayStatusBar = True .DisplayAlerts = False For i = 1 To UBound(arFiles) .StatusBar = "Обработка файла " & i & " из " & UBound(arFiles) Set wbSrc = Workbooks.Open(arFiles(i), ReadOnly:=True) For Each shSrc In wbSrc.Worksheets If IsNull(shSrc.UsedRange.Text) Then 'лист не пустой Set shTarget = wbTarget.Sheets.Add(after:=wbTarget.Sheets(wbTarget.Sheets.Count)) shTarget.Name = shSrc.Name & "-" & i shSrc.Cells.Copy shTarget.Range("A1") End If Next wbSrc.Close False 'закрыть без запроса на сохранение Next .ScreenUpdating = True .DisplayStatusBar = stbar .StatusBar = False If wbTarget.Sheets.Count = 1 Then 'не добавлено ни одного листа MsgBox "В указанных книгах нет непустых листов, сохранять нечего!" wbTarget.Close False End Else .DisplayAlerts = False wbTarget.Sheets(1).Delete .DisplayAlerts = True End If On Error Resume Next 'если указанный путь не существует и его не удается создать, 'обзор начнется с последней использованной папки If Dir(strSaveDir, vbDirectory) = Empty Then MkDir strSaveDir ChDir strSaveDir On Error GoTo 0 arFiles = .GetSaveAsFilename("Результат", "Excel Files (*.xls), *.xls", , "Сохранить объединенную книгу") If VarType(arFiles) = vbBoolean Then 'если не выбрано имя GoTo save_err Else On Error GoTo save_err wbTarget.SaveAs arFiles End If End save_err: MsgBox "Книга не сохранена!", vbCritical End With End SubSet shTarget = wbTarget.Sheets.Add(after:=wbTarget.Sheets(wbTarget.Sheets.Count))
Что делать?
заменил Sheets() на Sheets(1), теперь собирает только первый лист из файлов. Почему то при наличии скрытых и очень скрытых листов в собираемых книгах Эксель упорно вылетал с ошибкой... после замены всё ОК стало.
Обращаюсь к вам со следующим вопросом. Мне необходимо скопировать из книги не все листы, а только некоторые. Порядковые номера этих листов прописанны в определенных ячейках основной книги. Т.е., копируются только те листы, номера которых указаны в ячейках. Количество копируемых листов строго ограничено - 5шт.
Каким образом видоизменится макрос?
Заранее благодарю за помощь.
С уважением, Владислав!
Sheets(ThisWorkbook.Worksheets("Лист1").Range("A1")).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) Sheets(ThisWorkbook.Worksheets("Лист1").Range("A2")).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) Sheets(ThisWorkbook.Worksheets("Лист1").Range("A3")).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)Подразумевается, что номера листов, которые надо копировать, лежат в ячейках А1, А2 и А3 на листе Лист1 основной книги.
в вашей надстройке PLEX также есть возможность собирать в одну книгу листы из разных книг. Всё работало хорошо до вчерашнего дня. сейчас же, при попытке собрать листы в одну книгу процесс идет до какого то момента и отваливается либо просто по ошибке Экселя либо по ошибке Run-Time Error -2147417848 (80010108) Automation error и Эксель закрывается. Если успеть перед ошибкой сохранить документ то при открытии выскакивает ошибка "слишком много различных форматов ячеек". причем даже не получается собрать те данные которые неделей раньше с успехом собирались. Подскажите, пожалуйста, что нужно в коде поменять чтобы собирались только данные с листов, без форматов или может быть подскажите что в экселе изменилось, что он не хочет корректно работать. Спасибо вам за помощь.
Советую посмотреть (взять) код прямо в PLEX.
Правильно я понимаю, что файлы должны быть в старом формате «Книга Excel 97-2003» .. ?
Когда мне предлагается выбрать файлы для объединения, то файлы в формате «Excel» и в формате с поддержкой макросов даже не отображаются..
Если так, то очень жаль – потому что при переводе файлов в формат «Книга Excel 97-2003» сильно портится форматирование ..
Последним из предложенных методов у меня даже получилось объединить.. но.. со ссылками на исходные файлы.. Это никуда не годится.
Что можно сделать .. пож-та посоветуйте .. !
У меня есть книга (отчет).
В этот отчет нужно добавлять информацию из 36 разных книг, т.е. существует 36 файлов exсel.
я делал старым - бабаевским методом просто давал ссылку на каждый из 36 файлов ячейку,
но информация не обновляется, нужно как бы открыть 36 файлов, только после этого информация обновляется
я решил использовать данный макрос, но проблема в том, что каждый месяц у меня разные данные в 36 файлах
и если я добавляю еще файлы то они добавляются к существующим 36. если я удаляю старые 36 и добавляю новые 36, то ссылки бьются, т.е. больше не ссылаются...
что посоветуйте сделать?
Формат таблиц на всех листах одинаковый.
1. Почему то вставляет только пустые листы..(
2. Поддержу Александра с вопросом о копировании таблиц в одну и по возможности копирование разных столбцов из разных книг в одну таблицу, в данный момент очень нужно в работе, помогите пожалуйста!
заранее спасибо
Крутой макрос) Спасибо!
У меня макрос отказывается работать.
Я запускаю макрос из эксельки, и пытаюсь собрать туда листы из csv файлов.
Количество столбцов в csv намного превышает этот показатель в эксель файле (в котором я запускаю макрос). Получается ошибка:
Рекомендую перейти уже на Excel 2007 хотя бы - там не 255 столбцов, а 16 тысяч
Данная ошибка меня не удивляет, просто обращаю ваше внимание, что обработка подобного рода проблем не предусмотрена в вашем макросе.
А столбцов в экселе мало - потому что он сохранён в 97-2003 - там к макросам более лояльное отношение
Спасибо.
Новые форматы файлов (XLSX, XLSM и XLSB) сильно лучше почти по всем параметрам старого XLS. Хотя, это вопрос привычки, конечно.
Я с вами абсолютно согласен, всех защит от дураков не сделаешь, да и смысла мало. Просто запустил его - ошибка вылезает. Растерялся, поделился тут скрином)
За код большое спасибо - мне он оказался очень полезным.
Пожалуйста, помогите оптимизировать следующую задачу.
Каждый день приходят в одну папку файлы с предложениями по ценам на товар (Количество исходных файлов до 50 штук). Старые файлы при этом удаляются.
Возможно ли создать сводную таблицу, которая будет автоматически собирать данные и обновлять их со всех файлов на один лист с названием файла в каждой строке сводной таблицы.
С условием, что путь к папке мы указываем один раз.
Подскажите, можно ли при сборке вышеуказанным макросом листов с разных книг одновременно и разрывать связи, которые там присутствуют?
Буду очень признателен, если поделитесь необходимым для этого макросом
Спасибо!
1. Мне нужно создать новую книгу (обозначу ее как - книга (2)), в которой первая вкладка должна быть такой же, как у другой подобной книги (книга (1)) , мало того, эта вкладка в книге (1) с течением времени обновляется (туда добавляются строки, причем не только в конец листа, но и в середине) и необходимо, что бы дубликат этой вкладки в книге (2) автоматически синхронизировался с ней и информация на обоих этих вкладках (книги (1) и книги(2)) была одинаковой.
2. Загвоздка заключается еще и вот в чем: на этой вкладке книги (1) в определенной графе имеется ряд гиперссылок на листы этой же книги, тоже самое предполагается сделать с дубликатом этой же вкладки в книге (2), но только гиперссылки уже на листы книги (2). Подскажите пожалуйста, можно ли это сделать и если можно, то как? есть ли подобные макросы или необходимо воспользоваться некой формулой?
Хочу попробовать собирать информацию с листов как указанно по данной ссылке, а что нужно сделать, что бы открылось вот это окошко?
Спасибо
а csv файлы есть макрос для сборки в одну книгу?
а то ни один не работает(
спасибо