Несколько листов в один vba excel

Сборка листов из разных книг в одну

Предположим, имеется куча книг 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

Merging data from more than one Excel sheet in the same workbook is a real hassle… until you use VBA macros.

Macbook with a diary next to it

Excel VBA is an integral part of Excel automation, and VBA’s usage and benefits can’t be undermined. If you’re in an uphill battle trying to consolidate multiple sheets and workbooks in Excel, we’re here to help.

The macros mentioned in this guide will help you achieve the seemingly insurmountable task in a matter of seconds (or minutes, if the data assets are large).

By following this tutorial, you’ll create your own VBA macro in Excel and efficiently merge multiple sheets into one single sheet.

Merging Multiple Excel Sheets in the Same Workbook

For this task, the data is stored in the following sheets:

  • Sheet1
  • Sheet2
  • Sheet3

The sheet names listed above are for illustration purposes only. This VBA macro is generic and doesn’t depend on the sheet names; you can customize the code to use it with any sheet name(s).

Pre-Requisites for Running the Code

There are some prerequisites for running the VBA code listed below.

You need to store the macro code in a new Excel file. Save this workbook with a .xlsm extension. You can save the VBA macro workbook with any name.

Open a new Excel file; press Alt + F11 on your keyboard to open the Excel VBA editor. Once the editor opens, add a new code module by clicking on the Insert tab at the top. Select Module to insert a new module; this is where you’ll be entering the VBA macro code given below.

Excel VBA editor window interface

The data sheets to be consolidated should be in another separate workbook altogether. The name of the workbook and sheets can be whatever you choose.

As soon as you execute the VBA code, the VBA macro will cycle through each available worksheet in the primary workbook (data workbook) and paste the contents into a newly added sheet within the same workbook.

The consolidated data will be available in the sheet named Consolidated.

Running the VBA Code

It’s time to run the newly saved macro code. Copy-paste this code into the VBA editor’s module:

 Sub consolidate_shts()

'declare the various variables used within the code and the vba data types

Dim sht As Worksheet, sht1 As Worksheet, lastrow As Integer, lastrow1 As Integer

'disable screen flickering and alert pop-ups during the execution

With Application

.ScreenUpdating = False

.DisplayAlerts = False

End With

'store the name of the primary workbook in the a macro variable. Replace Test.xlsx with the name of your primary workbook

Set wbk1 = Workbooks("Test.xlsx")

'activate the workbook before performing the function(s) on it

wbk1.Activate

'run a vba for loop to check if a sheet Consolidated already exists. If it exists, the for loop will delete it.

For Each sht In wbk1.Sheets

If sht.Name = "Consolidated" Then sht.Delete

Next sht
'Add a new sheet to store the newly consolidated data

Worksheets.Add.Name = "Consolidated"

'Add some headers to each individual column within the consolidated sheet

With Sheets("Consolidated")

.Range("a1").Value = "OrderDate"

.Range("b1").Value = "Region"

.Range("c1").Value = "Rep"

.Range("d1").Value = "Item"

.Range("e1").Value = "Units"

.Range("f1").Value = "UnitCost"

.Range("g1").Value = "Total"

End With

'The newly created sheet consolidated will hold the consolidated data from each individual sheet in the primary workbook

For i = 1 To wbk1.Worksheets.Count

If Sheets(i).Name <> "Consolidated" Then

'Capture the last populated row from the data sheets in the workbook

lastrow = Sheets(i).Range("a1").End(xlDown).Row

'Capture the last populated row in the Consolidated sheet

lastrow1 = wbk1.Sheets("Consolidated").Range("a1048576").End(xlUp).Row + 1

'Copy data from source sheet and paste it in the consolidated sheet

Sheets(i).Range("a2:g" & lastrow).Copy Destination:=Sheets("Consolidated").Range("a" & lastrow1)

End If

Next i

'Enable Excel VBA functions for future use

With Application

.ScreenUpdating = True

.DisplayAlerts = True

End With

End Sub

The VBA Code Explained

First, declare all the variables you’re using within the code and assign them with the correct VBA data types to make the code run seamlessly.

Once you declare the variables, some basic housekeeping is needed. This is done by disabling screen flickering and suppressing pop-up alerts. For example, when you delete an existing sheet using the VBA code, a prompt within Excel asks for confirmation before deleting the sheet. Prompts like this are suppressed to enhance the speed of execution.

In the next step, you need to define the workbook’s name, which contains all of your data. Replace Test.xlsx with the name and extension of your workbook name. Make sure you surround the name with quotes.

VBA editor interface

Activate the primary workbook and delete any existing sheets with the name Consolidated to eliminate any previously stored data. The VBA code toggles through each sheet, and as soon as it encounters the sheet name Consolidated it’ll delete it. This is done using the VBA IF statement, which checks for logical conditions and deletes the sheet as soon as the condition is met.

A new sheet is added to the primary workbook to store the consolidated data. Subsequently, pre-formatted, standardized headers are added to this sheet. You can change the values of the titles (column headers) by updating the information next to the cell references within quotes.

For example: .Range(“a1”) = “OrderDate” can be replaced with .Range(“a1”) = “OrderNumber”

VBA editor interface

Next, a VBA FOR loop toggles through each worksheet, copies the sheet’s contents, and pastes the contents into the Consolidated worksheet before moving to the next sheet in the workbook. This process repeats until all sheets are copied over.

During this process, all the rows are auto-calculated and pasted in the Consolidated sheet. The last populated row is auto-calculated before the data is pasted in. The macro is dynamic and can adjust to varying data rows within each worksheet.

Once data from all sheets is pasted into the main consolidation sheet, the macro moves to the final leg of the code. The VBA functions initially disabled are enabled again for future use.

VBA editor interface

Consolidating Multiple Sheets Using Excel VBA Macro

Excel VBA is a superfluous programming language, which works well with all Excel components. Each piece of code is essential, and it’s important to remember that the execution is dependent on a line-by-line execution system, so you shouldn’t change the order of the code lines.

To customize the code for your requirements, you can make the required changes and run this code to consolidate the data efficiently and effectively in seconds.

Как объединить или объединить рабочие листы или книги в один рабочий лист?

В нашей повседневной работе мы можем столкнуться с проблемой объединения сотен листов или книг в один лист для анализа данных, что занимает много времени, если вы используете команду «Копировать и вставить» в Excel. В этом уроке я дам несколько советов по быстрому решению этой задачи.

док комбинировать 1

БЫСТРАЯ НАВИГАЦИЯ

Объединение всех листов активной книги в один лист с помощью VBA
Объединение десятков листов или книг в один лист / книгу с помощью щелчков мышью
Объединение двух таблиц в одну и обновление по столбцу кликами
Скачать образец файла


Объединение всех листов активной книги в один лист с помощью VBA

В этом разделе я предоставляю код VBA, который создаст новый лист для сбора всех листов активной книги, пока вы ее запускаете.

1. Активируйте книгу, все листы которой вы хотите объединить, затем нажмите + ключи для открытия Microsoft Visual Basic для приложений окно.

2. Во всплывающем окне нажмите Вставить > Модули для создания нового скрипта модуля.

3. Скопируйте приведенный ниже код и вставьте его в скрипт.

Sub Combine()
'UpdatebyExtendoffice
Dim J As Integer
On Error Resume Next
Sheets(1).Select
Worksheets.Add
Sheets(1).Name = "Combined"
Sheets(2).Activate
Range("A1").EntireRow.Select
Selection.Copy Destination:=Sheets(1).Range("A1")
For J = 2 To Sheets.Count
Sheets(J).Activate
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Offset(1, 0).Resize(Selection.Rows.Count - 1).Select
Selection.Copy Destination:=Sheets(1).Range("A65536").End(xlUp)(2)
Next
End Sub
док комбинировать 2

4. Нажмите F5 key, то все данные на листах были объединены в новый лист с именем Combined, который помещается перед всеми листами.


не двигаться

Вы хотите повысить зарплату и много времени проводить с семьей?

Вкладка Office повышает эффективность работы Microsoft Office на 50% прямо сейчас

Невероятно, но работать с двумя или более документами проще и быстрее, чем над одним.

По сравнению с известными браузерами инструмент с вкладками в Office Tab более мощный и эффективный.

Сократите для вас сотни щелчков мыши и набора текста с клавиатуры каждый день, попрощайтесь с рукой мыши.

Если вы обычно работаете с несколькими документами, вкладка Office поможет вам сэкономить время.

30— дневная бесплатная пробная версия, кредитная карта не требуется.

Узнать большеСкачать сейчас


Объединение десятков листов или книг в один лист / книгу с помощью щелчков мышью

С помощью VBA вы можете объединять листы только в активной книге, но как вы можете объединить листы из книг в лист или книгу?

Объединение листов из книг в один лист
док комбинировать 18

Объединение листов из книг в одну книгу
док комбинировать 3

Для решения этой задачи и удовлетворения других требований по комбинации листов Сочетать функция была разработана с четырьмя комбинированными сценариями:

  • Объедините несколько листов или книг на один лист
  • Объедините несколько листов или книг в одну книгу
  • Объединить листы с одинаковыми именами в один лист
  • Объединяйте значения на листах или в книгах на один лист

Здесь в качестве примера рассматривается второй вариант:

Объедините несколько листов или книг в одну книгу

После бесплатная установка Kutools for Excel, пожалуйста, сделайте следующее:

1. Активируйте Excel, щелкните Кутулс Плюс > Сочетать, появится диалоговое окно, напоминающее вам, что книги, которые вы хотите объединить, необходимо закрыть. Нажмите OK для продолжения.
док комбинировать 4
док комбинировать 5

2. в Объедините рабочие листы, шаг 1 диалог, проверьте Объедините несколько листов из книг в одну книгу вариант. Нажмите Download для перехода к следующему шагу мастера.
док комбинировать 6

3. Нажмите Добавить > Файл or Папка чтобы добавить книги, которые вы хотите объединить, в Список рабочих книг панели, затем вы можете указать, какой лист будет объединен, проверив имена в Список рабочих листов панель. Нажмите Download перейти к последнему шагу мастера.
док комбинировать 7

4. На этом шаге укажите нужные вам настройки. Затем нажмите Завершить.
док комбинировать 8

5. Появится окно, в котором вы выберете папку для размещения объединенной книги, затем нажмите Сохраните.
док комбинировать 9

Теперь книги объединены в одну книгу. И в начале всех листов мастер-лист с именем Kutools for Excel также создается, в котором перечислены некоторые сведения о листах и ​​ссылки для каждого листа.
док комбинировать 10

Демонстрация: объединение листов / книг в один лист или книгу

Kutools for Excel:200 + полезных удобных инструментов, упрощающих сложные задачи в Excel в несколько кликов.

Попрощайтесь с мышиной рукой и шейным спондилезом

300 продвинутых инструментов Kutools for Excel решить 80% Задачи Excel за считанные секунды, избавят вас от тысяч щелчков мышью.

Легко справляйтесь с 1500 рабочими сценариями, не нужно тратить время на поиск решений, у вас будет много времени, чтобы наслаждаться жизнью.

Ежедневно повышайте производительность на 80% для более чем 110000 высокоэффективных людей, включая вас.

Больше не мучиться мучительными формулами и VBA, дайте своему мозгу отдых и радостное рабочее настроение.

30— дневная бесплатная пробная версия со всеми функциями, 30день назад деньги без причины.

Лучшее тело создает лучшую жизнь.


Объединение двух таблиц в одну и обновление по столбцу кликами

Если вы хотите объединить две таблицы в одну и обновить данные на основе столбца, как показано на скриншоте ниже, вы можете попробовать Слияние таблиц полезности Kutools for Excel.
док комбинировать 11

Kutools for Excel: более 200 удобных надстроек Excel для упрощения сложных задач в несколько кликов в Excel

После бесплатная установка Kutools for Excel, пожалуйста, сделайте следующее:

1. Нажмите Кутулс Плюс > Слияние таблиц включить Слияние таблиц Мастер.
док комбинировать 12

2. На шаге 1 мастера вам необходимо отдельно выбрать диапазоны основной таблицы и таблицы поиска. Затем нажмите Download.
док комбинировать 13

3. Отметьте ключевой столбец, на основе которого вы хотите обновить данные в основной таблице. Нажмите Download.
док комбинировать 14

4. Затем отметьте столбцы в основной таблице, в которых вы хотите обновить данные на основе таблицы поиска. Нажмите Download.
док комбинировать 15

5. На шаге 4 мастера отметьте столбцы, которые вы хотите добавить из справочной таблицы в основную таблицу. Нажмите Download.
док комбинировать 16

6. На последнем этапе мастера укажите необходимые параметры настройки. Затем нажмите Завершить.
док комбинировать 17

Теперь в основной таблице были обновлены данные и добавлены новые данные на основе таблицы поиска.

Демонстрация: объединение листов / книг в один лист или книгу

Kutools for Excel:200 + полезных удобных инструментов, упрощающих сложные задачи в Excel в несколько кликов.


Скачать образец файла

образец


Рекомендуемые инструменты для повышения производительности

Вкладка Office — просмотр, редактирование и управление документами с вкладками в Microsoft Office 2019 — 2003 и Office 365

вкладка office

Профессиональная надстройка для ускорения работы Excel 2019-2007, сокращающая часы работы до секунд

Эта надстройка включает в себя десятки профессиональных групп, с более чем 300 опциями, которые автоматизируют большинство ваших повседневных задач в Excel и увеличивают вашу продуктивность как минимум на 50%. Например, группы опционов в один клик и пакетные преобразования.
Теперь у вас есть шанс ускорить себя с помощью Kutools for Excel!

вкладка kutools

вкладка kutoolsp

anytka

0 / 0 / 0

Регистрация: 10.02.2013

Сообщений: 27

1

Обьединение нескольких листов данных в один макросом

11.02.2013, 18:24. Показов 41075. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, подскажите пожалуйста.
У меня есть 30 листов с данными
Мне нужно объединить их в один лист. Как мне записать макрос?
Я копирую данные из первого листа выделяю до последней ячейки с данными, вставляю в общий лист, далее перехожу на новый лист, так же копирую данные, выделяю до последней ячейки. Но у меня кол-во ячеек в каждом листе может меняться, как правильно прописать код?

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Rows("2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    ActiveWindow.ScrollWorkbookTabs Position:=xlLast
    Sheets("Общий").Select
    Range("A2").Select
    ActiveSheet.Paste
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    Sheets("PIL2PIL_2").Select
    Rows("2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveWindow.ScrollWorkbookTabs Position:=xlLast
    Sheets("Общий").Select



0



Watcher_1

356 / 162 / 27

Регистрация: 21.06.2011

Сообщений: 350

11.02.2013, 21:29

2

Как смог, понял структуру вашего файла…
Кол-во заполненных строк проверяется по столбцу А

Visual Basic
1
2
3
4
5
6
7
8
9
Sub m()
    For i = 1 To Sheets.Count
        If Sheets(i).Name <> "Общий" Then
           myR_Total = Sheets("Общий").Range("A" & Sheets("Общий").Rows.Count).End(xlUp).Row
           myR_i = Sheets(i).Range("A" & Sheets(i).Rows.Count).End(xlUp).Row
           Sheets(i).Rows("1:" & myR_i).Copy Destination:=Sheets("Общий").Range("A" & myR_Total + 1)
        End If
    Next
End Sub



1



Igor_Tr

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

11.02.2013, 23:24

3

Как раз что-то похожее делал для себя. Кидаю вариант и немного обясню. Предполагается, что у меня должен бы быть лист Общих данных «GenExMan» (в даном случае — обобщенный лист счетов с данными). Этот лист (раньше) был разделен так, что для каждого счета создался отдельный лист с именем счета и данными по этому счету. После создания отчета/обработки/ каждого счета, мне нужно опять опять все собрать на новый лист «MergeRecords» и потом вернуть на Android. Представленный код — это фрагмент общего, который все и собирает.
И еще — тут использована функция проверки наличия листа в книге. Если нужно будет — докину (хотя я ее где-то здесь уже выставлял). Старые коментарии — украинским, новые (для Вас) — русским. У меня все работает как часы. Пробуйте.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Sub ConsolidateAllSheet()
    Application.ScreenUpdating = False
    ' Проверяем наличие основного листа, с которого будет получено _
          список уникальных названий счетов
    If Not fun_SheetExists("GenExMan") Then ' 
        MsgBox "АРКУШ   " & "GenExMan" & "   ВІДСУТНІЙ."
        Exit Sub
            Else: Sheets("GenExMan").Select
    End If
    ' Проверяем наличие в книге листа, в который будем собирать _
           нужные нам листы.
    If Not fun_SheetExists("MergeRecords") Then
        Sheets.Add ' создаем
            With ActiveSheet
                .Name = "MergeRecords" ' именуем
                .Tab.ColorIndex = 10 ' красим ярлык
            End With ' ActiveSheet
        Sheets("GenExMan").Select
             ' Очищаем "собирательный лист" для новых данных
            Else: Sheets("MergeRecords").Cells.Delete ' _
                                    вивільнюємо аркуш для перезапису.
    End If
    Application.ScreenUpdating = True
    
    Set Dict = CreateObject("Scripting.dictionary") ' создаем словарь
 
    With Sheets("GenExMan")
        Set mRng = Range(.Cells(1, 1), _
                        Cells(1, .UsedRange.Columns.Count))
        counter = 0
        For Each CurrCell In mRng
            counter = counter + 1
            ReDim Preserve arr1(counter)
            arr1(counter) = mRng.Cells(counter) ' _
                                            Назви полів - в масив.
        Next ' CurrCell
        With Sheets("MergeRecords")
            .Cells(1).Resize(1, UBound(arr1)).Value = arr1
        End With
        Erase arr1 ' вивільнення пам'яті.
        With mRng
           ' Определяем в общем листе номер столбца с названиями счетов
            mstr = "Account" ' Знаходимо поле з значенням _
                         "Account" - це будуть ключі Dict.
            Set CurrCell = .Find(What:=mstr, _
                            LookAt:=xlWhole, SearchFormat:=False)
                If mRng Is Nothing Then
                    MsgBox "Не   знайдено !": Exit Sub
                        Else: mCol = CurrCell.Column
                End If
        End With ' mRng
        ' Выбираем уникальные названия счетов
        For i = 2 To .UsedRange.Rows.Count ' отримую _
                                       перелік назв рахунків.
            If Not Dict.exists(Trim(.Cells(i, mCol).Value)) Then
                Dict.Add key:=Trim(.Cells(i, mCol).Value), _
                                        Item:=Trim(.Cells(i, mCol).Value)
            End If
        Next 'i
    End With
    ' Заливаем уникальные названия счетов в массив genKeys. _
           В данном случае ними будут и ключи, и значения словаря. 
    genKeys = Dict.keys ' ключі словника - в масив.
    Set Dict = Nothing ' видаляємо словник.
    ' Ниже - просто проверка при отладке.
''--Results--Verification------------------------
'Stop
'    Application.SendKeys "^g^a {Del}"
'    For i = LBound(genKeys) To UBound(genKeys)
'        Debug.Print genKeys(i)
'    Next 'i
''==End==Verification======================
 
     ' А вот этот коротенький код уже собственно перебирает _
       раздельные листы счетов, заганяет по каждому листу _
       значения в массив  mArr ...
'Stop
    For i = LBound(genKeys) To UBound(genKeys)
        Erase mArr ' очищаємо масив
        With Sheets(genKeys(i))
            mArr = Range(.Cells(2, 1), _
                .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Value
        End With
    '... и, наконец, выгружает массив mArr  на сборочный лист "MergeRecords".
'Stop
        With Sheets("MergeRecords")
            r = .UsedRange.Rows.Count + 1
            .Cells(r, 1).Resize(UBound(mArr, 1), _
                    UBound(mArr, 2)).Value = mArr
        End With
    Next 'i
 Stop
        
End Sub



1



0 / 0 / 0

Регистрация: 22.01.2016

Сообщений: 1

22.01.2016, 20:29

4

Igor_Tr, вечер добрый, не могли бы вы подсказать как использовать ваш макрос в своей таблице?
Лист1 — 44 составляющих для отбора по всем листам ( всего листов 160)



0



Nyusya

0 / 0 / 0

Регистрация: 13.10.2015

Сообщений: 1

08.08.2016, 09:43

5

Цитата
Сообщение от Watcher_1
Посмотреть сообщение

Как смог, понял структуру вашего файла…
Кол-во заполненных строк проверяется по столбцу А

Visual Basic
1
2
3
4
5
6
7
8
9
Sub m()
    For i = 1 To Sheets.Count
        If Sheets(i).Name <> "Общий" Then
           myR_Total = Sheets("Общий").Range("A" & Sheets("Общий").Rows.Count).End(xlUp).Row
           myR_i = Sheets(i).Range("A" & Sheets(i).Rows.Count).End(xlUp).Row
           Sheets(i).Rows("1:" & myR_i).Copy Destination:=Sheets("Общий").Range("A" & myR_Total + 1)
        End If
    Next
End Sub

Доброго дня!
Случайно забрела сюда в поиске макроса по сбору данных и нашла именно то, что нужно.
Только два вопросика, как в данный макрос можно добавить имена листов, откуда копируются данные и каеую команду добавить, чтобы вставлялись значения вместо формул. Заранее благодарю!



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

08.08.2016, 09:43

5

объединение определенных листов в один

MARINKA

Дата: Среда, 20.06.2018, 00:20 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Для объединения нескольких листов в один часто пользуюсь макросом, очень выручает.
Но не понимаю, что нужно изменить, чтоб объединялись только конкретные листы.
Есть книги с листами 01,02….31, но так же там есть листы 01., 02., 03!, 04итого и тп.
Что поменять в макросе, чтобы была возможность объединения только нескольких листов: например, только 01+02+03?

Сообщение отредактировал MARINKAСреда, 20.06.2018, 00:21

 

Ответить

MARINKA

Дата: Среда, 20.06.2018, 00:20 |
Сообщение № 2

Группа: Пользователи

Ранг: Новичок

Сообщений: 37


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

Option Explicit

Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iBeginRange As Object, lCalc As Long, lCol As Long
    Dim oAwb As String, sCopyAddress As String, sSheetName As String
    Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
    Dim wsSh As Object, wsDataSheet As Object, bPolyBooks As Boolean, avFiles
    Dim wbAct As Workbook
    Dim bPasteValues As Boolean

        On Error Resume Next
    ‘Выбираем диапазон выборки с книг
    Set iBeginRange = Application.InputBox(«Выберите диапазон сбора данных.» & vbCrLf & _
                    «1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. » & _
                    vbCrLf & «2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.», Type:=8)
    ‘для указания диапазона без диалогового окна:
    ‘Set iBeginRange = Range(«A1:A10») ‘диапазон указывается нужный
    ‘Если диапазон не выбран — завершаем процедуру
    If iBeginRange Is Nothing Then Exit Sub
    ‘Указываем имя листа
    ‘Допустимо указывать в имени листа символы подставки ? и *.
    ‘Если указать только * то данные будут собираться со всех листов
    sSheetName = InputBox(«Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)», «Параметр»)
    ‘Если имя листа не указано — данные будут собраны со вех листов
    If sSheetName = «» Then sSheetName = «*»
    On Error GoTo 0
    ‘Запрос — вставлять на результирующий лист все данные
    ‘или только значения ячеек (без формул и форматов)
    bPasteValues = (MsgBox(«Вставлять только значения?», vbQuestion + vbYesNo, «Excel-VBA») = vbYes)
    ‘Запрос сбора данных с книг(если Нет — то сбор идет с активной книги)
    If MsgBox(«Собрать данные с нескольких книг?», vbInformation + vbYesNo, «Excel-VBA.ru») = vbYes Then
        avFiles = Application.GetOpenFilename(«Excel files(*.xls*),*.xls*», , «Выбор файлов», , True)
        If VarType(avFiles) = vbBoolean Then Exit Sub
        bPolyBooks = True
        lCol = 1
    Else
        avFiles = Array(ThisWorkbook.FullName)
    End If
    ‘отключаем обновление экрана, автопересчет формул и отслеживание событий
    ‘для скорости выполнения кода и для избежания ошибок, если в книгах есть иные коды
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
    End With
    ‘создаем новый лист в книге для сбора
    Set wsDataSheet = ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count))
    ‘если нужно сделать сбор данных на новый лист книги с кодом
    ‘Set wsDataSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ‘цикл по книгам
    For li = LBound(avFiles) To UBound(avFiles)
        If bPolyBooks Then
            Set wbAct = Workbooks.Open(Filename:=avFiles(li))
        Else
            Set wbAct = ThisWorkbook
        End If
        oAwb = wbAct.Name
        ‘цикл по листам
        For Each wsSh In wbAct.Sheets
            If wsSh.Name Like sSheetName Then
                ‘Если имя листа совпадает с именем листа, в который собираем данные
                ‘и сбор идет только с активной книги — то переходим к следующему листу
                If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                With wsSh
                    Select Case iBeginRange.Count
                    Case 1 ‘собираем данные начиная с указанной ячейки и до конца данных
                        lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                        sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                    Case Else ‘собираем данные с фиксированного диапазона
                        sCopyAddress = iBeginRange.Address
                    End Select
                    lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                    ‘вставляем имя книги, с которой собраны данные
                    If lCol Then wsDataSheet.Cells(lLastRowMyBook, 1).Resize(Range(sCopyAddress).Rows.Count).Value = oAwb
                    If bPasteValues Then ‘если вставляем только значения
                        .Range(sCopyAddress).Copy
                        wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteValues
                    Else
                        .Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                    End If
                End With
            End If
NEXT_:
        Next wsSh
        If bPolyBooks Then wbAct.Close False
    Next li
    With Application
        .ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
    End With
End Sub

[/vba]

 

Ответить

_Boroda_

Дата: Среда, 20.06.2018, 10:15 |
Сообщение № 3

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

А что вы у автора макроса не спросите? Или забыли где взяли? Напомню — его зовут Дмитрий Щербаков (The_Prist)


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

sboy

Дата: Среда, 20.06.2018, 10:21 |
Сообщение № 4

Группа: Друзья

Ранг: Участник клуба

Сообщений: 2566


Репутация:

724

±

Замечаний:
0% ±


Excel 2010

[offtop]
макросы Дмитрия гуляют по сети, поэтому не факт, что макрос ТС взял с его сайта. Вот кусок, который «забыли» скопировать
[vba]

Код

‘—————————————————————————————
‘ Module    : mConsolidated
‘ DateTime  : 02.02.2010 17:06
‘ Author    : The_Prist(Щербаков Дмитрий)
‘ Purpose   : http://www.excel-vba.ru/chto-umeet-excel/kak-sobrat-dannye-s-neskolkix-listov-ili-knig/
‘             Процедура сбора данных с нескольких листов/книг
‘—————————————————————————————

[/vba]


Яндекс: 410016850021169

 

Ответить

InExSu

Дата: Вторник, 26.06.2018, 00:22 |
Сообщение № 5

Группа: Друзья

Ранг: Ветеран

Сообщений: 646


Репутация:

96

±

Замечаний:
0% ±


Excel 2010

Привет!
Для Вашего случая, похоже, можно оставить листы с длиной имени листа = 2.
Попробуйте:
между строк
[vba]

Код

For Each wsSh In wbAct.Sheets
If wsSh.Name Like sSheetName Then

[/vba]вставить строку
[vba]

Код

If Len(wsSh.Name) = 2 Then

[/vba]
и
между строк
[vba][/vba]
вставить строку
[vba][/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel

 

Ответить

Like this post? Please share to your friends:
  • Несколько операторов если excel
  • Несколько листов word напечатать на одном листе
  • Несколько окон одного документа word
  • Несколько листов excel свести в один
  • Несколько нулей в excel