Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#1 17.11.2016 21:59:29 Доброго вечера, уважаемые форумчане! В посте №24 — рабочий макрос.
Прикрепленные файлы
Изменено: Jack Famous — 24.11.2016 09:31:50 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|||||
SuperCat Пользователь Сообщений: 2737 |
Опять ТЗ строчим? There is no knowledge that is not power |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#3 17.11.2016 22:47:53 SuperCat, так и знал)))) да вот как ни напишу — всё как ТЗ выглядит))))
Изменено: Jack Famous — 18.11.2016 00:10:27 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
С.М. Пользователь Сообщений: 936 |
#4 18.11.2016 02:51:45
Изменено: С.М. — 18.11.2016 02:55:06 |
|
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
С.М., наконец-то первый вариант по теме))))) спасибо вам большое — как обращаться с этим зверем?))) выделял и 1 и 2 таблицу, запускал макрос — ничего((( Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#6 18.11.2016 12:11:34 Доброе время суток
Несколько щелчков мышкой… в Power Query. И выясняется, что в результате есть ошибочка Прикрепленные файлы
Изменено: Андрей VG — 18.11.2016 12:12:23 |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Андрей VG, здравствуйте!))) спасибо за пример, но пишет «указанного файла не существует» Изменено: Jack Famous — 18.11.2016 12:15:52 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#8 18.11.2016 12:15:38
Вы слишком быстро пришли за примером. Обнаружил, что не ту версию файла прикрепил. Переложил, и тут вы — качать… Накладка, однако |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Андрей VG, спасибо большое)))) есть возможность рассказать, как эту динамическую связку организовывать? Я бы в динамике всё построил… Изменено: Jack Famous — 18.11.2016 12:19:51 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
JeyCi Пользователь Сообщений: 3357 |
#10 18.11.2016 12:29:23
не делайте непроверенных выводов!.. в PQ — язык другой (M-language), язык DAX в PP #14 —> Расширенный редактор Изменено: JeyCi — 18.11.2016 12:32:33 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#11 18.11.2016 12:31:51 Можно чуть подсократить:
F1 творит чудеса |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#12 18.11.2016 13:05:09
Конечно!
|
||||
С.М. Пользователь Сообщений: 936 |
#13 18.11.2016 13:27:25
Не надо ничего выделять, жмём кнопку : Прикрепленные файлы
|
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
С.М., огромное спасибо!!! Буду разбираться с кодом))) Андрей VG и Максим Зеленский , благодарою за вариант решения через PQ — в перспективе этот вариант, скорее всего станет основным, а пока буду учить матчасть)))) Изменено: Jack Famous — 18.11.2016 13:45:07 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#15 18.11.2016 15:11:30 Андрей VG, нет предела совершенству
Изменено: Максим Зеленский — 18.11.2016 15:12:10 F1 творит чудеса |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#16 18.11.2016 15:33:34 Максим, у меня PQL через раз ругается, что не может выполнить Join из-за одинаковых названий столбцов
, поэтому и пришлось делать «лишнюю» операцию. Причём, если соединение по двум и более столбцам, тогда без вопросов — отрабатывает как и должно быть. Один из глюков PQL — может в последних и поправили. |
||
странно, у меня не ругается… |
|
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#18 18.11.2016 16:46:01 я думаю, в этом дело:
F1 творит чудеса |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Максим Зеленский, Андрей VG, подскажите, а эти формулы только руками вбивать или есть что-то вроде мастера функций, как в Excel — тогда дело за синтаксисом и практикой)) Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
JeyCi Пользователь Сообщений: 3357 |
#20 18.11.2016 18:24:47
Jack Famous вы кнопки в надстройке нажимайте и смотрите, что получается, а в расширенном редакторе — весь код целиком увидеть можно… вопрос в том в какой последовательности какие кнопки (в зависимости от того, какие шаги по коду совершить хотите)… последовательность — это уже вопрос алгоритмизации… для получения нужного на выходе… вы не стесняйтесь знакомиться с надстройкой , если чётко себе представляете алгоритм, который вам надо закодировать [решение порождает человек, простые шаги может пройти по кнопкам на ленте PQ]… сложные моменты придётся править руками, когда захотите выполнять ювелирную работу (как с макрорекодером)… — что вызвало проблему, чтобы самому прийти к такому выводу?? — особенно после прохождения по моему линку в #10 и ответа Максима там… Изменено: JeyCi — 18.11.2016 18:30:27 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
С.М. Пользователь Сообщений: 936 |
#21 18.11.2016 20:05:07
|
|||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
JeyCi, надо пробовать — спасибо за напутствие!)) Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
С.М., посидел, посмотрел — из переменных, которые смог: разглядеть только типы, помещения и таблица. Первые 2 — в виде именованных диапазонов, а таблица и есть таблица)) не могли бы вы изменить сам принцип работы макроса? Сейчас он решает одну конкретную задачу — ни влево, ни в право, к тому же он вставляет не значения столбца, а самостоятельно индексирует третий столбец справочника. То есть, если мне нужно вставлять какой-либо другой столбец — это очень замороченная процедура получится… Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#24 24.11.2016 09:41:44 Доброго утра, уважаемые форумчане!
Прикрепленные файлы
Изменено: Jack Famous — 24.11.2016 10:25:06 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Отдельная благодарность Андрей VG, Максим Зеленский и JeyCi — с их подсказок удалось довольно простым способом осуществить подобную связь в динамически обновляемом виде через запросы в Power Query — теперь, связав 2 и более таблицы через запросы по ключевым полям и удалив в этих запросах всё лишнее, можно готовый итоговый запрос выгрузить в книгу и строить сводную по нему. При изменении/дополнении/удалении данных в справочниках — всё динамически обновляется и в сводной. Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Максим Зеленский Пользователь Сообщений: 4646 Microsoft MVP |
#26 29.11.2016 15:40:57
F1 творит чудеса |
|||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Максим Зеленский, да — добавить в модель данных и готово))) подскажите, пожалуйста аналоги функций СУММЕСЛИМН и СЧЁТЕСЛИМН для Power Query. Или это только через DAX в Power Pivot? А то таблички посвязывал по ключевым полям (6 штук), а этого капец как не хватает… Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#28 29.11.2016 21:21:22 Доброе время суток
Смотря что вы под этим подразумеваете. В общем случае — фильтрация по критериям и группировка (плоская сводная таблица). |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Андрей VG, доброй ночи! Изменено: Jack Famous — 30.11.2016 00:24:07 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#30 30.11.2016 00:27:28 МОДЕРАТОРАМ: предлагаю (из-за развития темы вне названия) следующее название темы — «Объединение таблиц. Макросы, Power Query и Power Pivot» Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Содержание
- Vba excel объединение таблиц
- Слияние двух таблиц Excel (с использованием VBA)
- Редактировать:
- Vba excel объединение таблиц
Vba excel объединение таблиц
Существует две таблицы с данными:
- Таблица Goods в которой хранятся товары.
- Таблица Costs в которой хранятся цены этих товаров.
Нужно связать эти две таблицы в одну, получив, тем самым таблицу, содержащую в себе как товары, так и их цены (разбиты по городам). В обеих таблица существует поле «Номенклатурный номер», по которому и предполагается связывать данные из исходных таблиц. Проще говоря, нужно получить таблицу Result, добавив в таблицу Goods последние четыре столбца из таблицы Costs, на основании эквивалентности поля «Номенклатурного номер».
Excel 2003
Файл с книгой прикрепил.
Вложения
Catalog.rar (352.6 Кб, 63 просмотров) |
У Вас там косяк в номере 400019075.
Если последние 4, то отработал код из http://hugo.nxt.ru/CompareFiles.Find.rar
1146 совпадений.
Настройки:
Файл — приёмник: C:tempVectorCКаталог.xls
Файл — источник: C:tempVectorCКаталог.xls
Столбцы сравнения в приёмнике: a
Столбцы сравнения в источнике: a
Лист — приёмник (№): 1
Лист — источник (№): 2
Столбцы — приёмники данных копирования: O,P,Q,R
Столбцы — источники данных копирования: E,F,G,H
Добиваем первый лист данными второго. Можно сперва на лист Result скопировать данные первого листа и добивать туда.
Спасибо, только у меня почему-то ничего не получилось.
Пишет:
Object doesn’t support this property or method
В чём косяк номера 400019075?
Жаль. Версия Экселя какая у Вас? У меня на 2000 и 2007 работает.
А косяк в том, что 400019075 два раза в таблице — один раз данных больше.
Хотя именно под эту задачу несложно макрос на массиве написать — вечером могу сделать, если раньше не напишут.
Источник
Слияние двух таблиц Excel (с использованием VBA)
Я пытался выяснить, как объединить две таблицы из одной книги в третью, используя VBA. Пример:
Отключенный выход (рабочий лист3):
Мне понадобится решение VBA, так как исходные таблицы занимают около 400 строк, и мне нужно будет выполнить одну и ту же операцию для нескольких книг. Я был бы очень признателен за любое предложение по этой проблеме!
Редактировать:
Если это кому-то интересно, мне удалось создать рабочий код. Worksheet1 был псевдонимом для «Импорт списка», а Worksheet2 — «Экспорт списка». В обоих листах я вставил столбец (C), в котором указаны обе страны. Я использовал этот новый столбец и значения для построения таблицы в Worksheet3 (теперь «Combolist»).
Хотя это можно решить с помощью VBA, вам, вероятно, будет лучше использовать формулы (если вы не должны делать это очень часто). Решение VBA потребует некоторых ноу-хау и даже больше, если вы хотите иметь возможность поддерживать решение.
Формула Excel будет довольно простой. Сначала создайте столбец UniqueID :
Вы бы сделали то же самое для обеих таблиц. Затем получите все уникальные уникальные UniqueID . Для этого вы можете использовать Data > Remove Duplicates , просто сделайте копию перед удалением дубликатов, иначе вы удалите записи из вашего источника. Поместите этот список UniqueID в новую Table . Имейте в виду, что все это будет проще, если все ваши данные находятся в формате Table (вы увидите вкладку » Table » в ленте, когда внутри диапазона таблицы.
Если вам нужно отформатировать данные в виде таблицы, перейдите на рабочий лист, нажмите CTRL+HOME (это относится к самой первой ячейке). Если ваша первая ячейка находится в другом месте, просто перейдите туда. Если ваша таблица является единственной информацией на листе, попробуйте использовать CTRL+SHIFT+END чтобы выделить ее для последней используемой ячейки. В противном случае комбинация CTRL+SHIFT+RIGHT и CTRL+SHIFT+DOWN доставит вам то, что вам нужно. Наконец, назовите свой стол для любви ко всему, что превосходит, эта простая привычка экономит массу времени. В моем примере я предполагаю, что у вас есть таблица » Primary и Secondary .
Наша формула в нашей комбинированной таблице будет выглядеть примерно так:
=IfError(Vlookup([UniqueID], Primary, Column(Primary[Value]), False), «»)
Или, если ваша Primary таблица не начинается в первом столбце, используйте это:
=IfError(Vlookup([UniqueID], Primary, 4, False), «»)
Разница здесь в том, что первая изменит индекс при перемещении столбца, последний не будет и должен быть отредактирован при редактировании таблицы.
Сделайте то же самое в следующем столбце для другой таблицы:
=IfError(Vlookup([UniqueID], Secondary, Column(Primary[Value]), False), «»)
=IfError(Vlookup([UniqueID], Secondary, 4, False), «»)
Это «объединит» два набора на основе общего UniqueID и оставит пробелы, если запись не существует. Изучение того, как это сделать, может быть менее удобным, чем изучение того, как это сделать в VBA, но я бы сильно отговорил вас от изучения VBA, если вы не можете использовать такую реализацию.
Чтобы быть ясным, причина, по которой формульный подход является идеальным в этом случае, заключается в том, что задача, которую вы просите о помощи, очень проста, и вы бы лучше развивали свои навыки Excel, поскольку, делая это, позволят вам решать аналогичные задачи гораздо быстрее в будущем. Даже новичок может реализовать это решение в течение 15 минут или около того, где вам легко понадобится время, чтобы изучить масштабируемое решение VBA.
Источник
Vba excel объединение таблиц
Модератор форума: _Boroda_, китин
Мир MS Excel » Вопросы и решения » Excel и другие приложения » Google Docs » Скрипт объединения нескольких таблиц в одну (Формулы/Formulas)
Скрипт объединения нескольких таблиц в одну
Kashimirush | Дата: Четверг, 27.02.2020, 15:50 | Сообщение № 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||
Ответить function supercopy2() < //Запускаем цикл |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
Добрый день!
Excel’ем приходится пользоваться нечасто, поэтому прошу не пинать
Суть задачи:
Есть несколько таблиц с одинаковыми шапками на разных листах (Время — Событие — прочие данные).
Требуется на отдельном листе создать общую таблицу, которая будет банально объединять в себя все строчки из моих таблиц.
То есть итоговая таблица должна содержать все строки из исходных как если бы мы их копировали вручную. Желательно, при этом, чтобы она была динамической (при изменении/добавлении данных в исходные она должна обновляться).
Консолидация — не то что нужно, как я понял.
Пример:
Таблица 1:
10:30 — Подъём
11:30 — Завтрак
Таблица 2:
10:45 — Зарядка
15:40 — Обед
Итоговая таблица:
10:30 — Подъём
11:30 — Завтрак
10:45 — Зарядка
15:40 — Обед
Заранее спасибо!
Depending on whether or not you have duplicate values on either sheet, I could think of a few ideas, not using SQL though.
- Get LastRow of SourceSheet1 & SourceSheet2 — Set them as variables lastRow1 & lastRow2
- Create a row ticker for each sheet. s1Row, s2Row, tRow
- set tRow = 2 For the TargetSheet’s first line
- Use For loop to cycle through each row of SourceSheet1. Using something like this
- When the first part of code is done looping, you will be finished adding every item from SourceSheet1 onto the TargetSheet. Then you will have to check the values from SourceSheet2 to see if any were unique to that list.
- When that is done, you should have only added the ones that were missing from your initial search. Then the targetSheet will be in the order of SourceSheet1 All Items, then the extra items from SourceSheet2
SET VARIABLES
Private Sub JoinLists()
Dim rng As Range
Dim typeName As String
Dim matchCount As Integer
Dim s1Row As Integer
Dim s2Row As Integer
Dim tRow As Integer
Dim m As Integer
Dim lastRow1 As Integer
Dim lastRow2 As Integer
Dim SourceSheet1 As String
Dim SourceSheet2 As String
Dim TargetSheet As String
SourceSheet1 = "Source1"
SourceSheet2 = "Source2"
TargetSheet = "Target"
tRow = 2
lastRow1 = Sheets(SourceSheet1).Range("A65536").End(xlUp).row
lastRow2 = Sheets(SourceSheet2).Range("A65536").End(xlUp).row
PHASE ONE: Copying every entry from Sheet1 to Target, while grabbing matches from Sheet2
Set rng = Sheets(SourceSheet2).Range("A2:A" & lastRow2)
For s1Row = 2 To lastRow1
typeName = Sheets(SourceSheet1).Cells(s1Row, 1)
matchCount = Application.WorksheetFunction.CountIf(rng, typeName)
'Set the Row up on the TargetSheet. No matter if it's a match.
Sheets(TargetSheet).Cells(tRow, 1) = typeName
Sheets(TargetSheet).Cells(tRow, 2) = Sheets(SourceSheet1).Cells(s1Row, 2)
Sheets(TargetSheet).Cells(tRow, 3) = Sheets(SourceSheet1).Cells(s1Row, 3)
'Check to see if there are any matches on SourceSheet2
If matchCount = 0 Then
'There are NO matches. Add Zeros to the extra columns
Sheets(TargetSheet).Cells(tRow, 4) = 0
Sheets(TargetSheet).Cells(tRow, 5) = 0
Else
'Get first matching occurance on the SourceSheet2
m = Application.WorksheetFunction.Match(typeName, rng, 0)
'Get Absolute Row number of that match
s2Row = m + 1 ' This takes into account the Header Row, as index 1 is Row 2 of the search Range
'Set the extra columns on TargetSheet to the Matches on SourceSheet2
Sheets(TargetSheet).Cells(tRow, 4) = Sheets(SourceSheet1).Cells(s2Row, 2)
Sheets(TargetSheet).Cells(tRow, 5) = Sheets(SourceSheet1).Cells(s2Row, 3)
End If
tRow = tRow + 1
Next s1Row
PHASE TWO: Checking SourceSheet2 for Entries NOT on Sheet1
Set rng = Sheets(SourceSheet1).Range("A2:A" & lastRow1)
For s2Row = 2 To lastRow2
typeName = Sheets(SourceSheet2).Cells(s2Row, 1)
matchCount = Application.WorksheetFunction.CountIf(rng, typeName)
If matchCount = 0 Then
'There are NO matches. Add to Target Sheet
Sheets(TargetSheet).Cells(tRow, 1) = typeName
Sheets(TargetSheet).Cells(tRow, 2) = 0
Sheets(TargetSheet).Cells(tRow, 3) = 0
Sheets(TargetSheet).Cells(tRow, 4) = Sheets(SourceSheet2).Cells(s2Row, 2)
Sheets(TargetSheet).Cells(tRow, 5) = Sheets(SourceSheet2).Cells(s2Row, 3)
tRow = tRow + 1
'Not doing anything for the matches, because they were already added.
End If
Next s2Row
End Sub
EDIT: typo correction
Often we need to merge worksheets / workbooks containing lots of data. Imagine receiving periodical daily reports and wanting to quickly consolidate them to generate a weekly or monthly report… seems like a lot of work. Merging worksheets does not necessarily need to be hard… as long as you read through today’s post.
Looking to merge CSV or TXT files instead? Read this post
To exemplify the issue let’s consider a Workbook consisting of 2 worksheets (below named Sheet1 and Sheet2) with identical columns.
What we want to do is merge these 2 worksheets into one consolidated worksheet. We may of course want to do this in multiple ways e.g. by:
- Simply appending the worksheets to each other
- Merging the data sets while removing duplicates
Here is the example result we want to achieve (Sheet2 appended to Sheet1 on a third separate Worksheet):
In today’s Tip of the Day I will exemplify how to merge worksheets / tables (any number) with an option of eliminating duplicates.
Merging worksheets with VBA
Let’s first consider a simple piece of VBA code. The procedure below can handle any number of Worksheets – including Worksheets from external Workbooks as long as you have the Workbook open and provide it within the array of Worksheets passed to the procedure.
Sub Merge(ws() As Worksheet, destWs As Worksheet, headerInFirstRow As Boolean, removeDuplicates As Boolean) 'Clear destination worksheet destWs.UsedRange.EntireRow.Delete Dim pasteRange As Range, header As Range, firstFreeRow As Range, w As Variant, copyRange As Range 'Paste header If headerInFirstRow Then Set header = ws(0).UsedRange.Cells(1).EntireRow: header.Copy destWs.Cells(1).EntireRow End If Set firstFreeRow = destWs.UsedRange.Rows(destWs.UsedRange.Rows.Count).Offset(1).EntireRow 'Paste worksheets For Each w In ws Set copyRange = w.UsedRange.Rows("" & _ IIf(headerInFirstRow, 2, 1) & ":" & w.UsedRange.Rows.Count) copyRange.Copy firstFreeRow.Cells(1, 1) Set copyRange = Nothing Set firstFreeRow = destWs.UsedRange.Rows(destWs.UsedRange.Rows.Count).Offset(1).EntireRow Next w 'Remove duplicates If removeDuplicates Then Dim colArr As Variant, col As Long: ReDim colArr(0 To destWs.UsedRange.Columns.Count - 1) For col = 1 To destWs.UsedRange.Columns.Count colArr(col - 1) = col Next col destWs.UsedRange.removeDuplicates Columns:=(colArr), header:=IIf(headerInFirstRow, xlYes, xlNo) End If 'Clean Set firstFreeRow = Nothing: Set w = Nothing: Set header = Nothing End Sub
A now a simple example of this procedure being used assuming the example data I referenced above. Let’s assume data on is on worksheets Sheet1 and Sheet2, the destination Worksheet will be Sheet3.
Sub TestMerge() Dim ws(0 To 1) As Worksheet Set ws(0) = Sheet1 Set ws(1) = Sheet2 Merge ws, Sheet3, True, False End Sub
Notice that the Merge procedure accepts the following parameters:
- ws – an array of Worksheets
- destWs – the destination Worksheet
- headerInFirstRow – if true assumes that the header is in the first row of each source Worksheet
- removeDuplicates – if true remove all duplicates after merging the Worksheets
Simple enough right? Not too long. If you want to optimize it for best performance read this.
Merging worksheets with MS Query (SQL)
Now let’s consider a second approach – using MS Query (SQL). This is my personal favorite as MS Query SQL code is short, does not require VBA and the destination Worksheet can be refresh by simply right clicking on the table and hitting refresh.
To create a MS Query feel free to use my Excel SQL AddIn or follow the steps below:
Follow the instructions below if you don’t have my Excel SQL AddIn:
Open the From Microsoft Query Wizard
Data ribbon and then selecting From Other Sources and From Microsoft Query -> till the end be sure to hit View Data or Edit Query in Microsoft Query to be able to provide your own SQL query.
Proceed according to Wizard to edit SQL Query
As we want to merge several Worksheets within our current Excel Workbook we need to select Excel Files as the designated data source for our MS Query:
Next we need to select our Current Excel Workbook from the File Dialog:
Select the first Excel Worksheet you want to merge and click the right arrow > to drag it to the Columns in your Query section.
Next instead of Returning the Data hit the View data or edit Query in Microsoft Query radio button and proceed:
A new Window should pop-up. Look for the SQL button to modify the existing MS Query:
Modify the SQL Query to merge Worksheets
A new SQL Window should pop-up. You can modify any number of Worksheets using this approach. Below I am assuming I want to merge two Worksheets – Sheet1 and Sheet2. The MS Query need to therefore look like this:
SELECT * FROM [Sheet1$] UNION ALL SELECT * FROM [Sheet2$]
Simply modify the existing MS Query in the SQL Window and hit OK.
What if you need to merge 3 Worksheets not just 1?
Simply append an additional UNION ALL like this:
SELECT * FROM [Sheet1$] UNION ALL SELECT * FROM [Sheet2$] UNION ALL SELECT * FROM [Sheet3$]
For additional Worksheets repeat this pattern
Return Data to selected Worksheet
Now the pleasant part – loading the Query data. Look for the Return Data button, select a cell where the MS Query is supposed to load and hit OK.
Comment on using the MS Query approach
Simple and quick – this approach is more efficient than any VBA code we may develop as it is handled by the OLEDB driver. MS Query (SQL) is also more efficient in handling large chunks of data as compared to other approaches.
Merging worksheets with PowerQuery
If you are not familiar with PowerQuery feel free to download it from Microsoft here. PowerQuery features a lot of neat data-crunching / BI features. Let’s see how can we leverage PowerQuery to do our job.
Create tables from each source Worksheet
First what we need to do is link our source tables to PowerQuery so we can create the output query.
Select the whole range of each source worksheet (CTRL + A)
and select the From Table option from the PowerQuery ribbon. For this example I have named Sheet1 as Table1 and similarly with Sheet2.
Merge the Worksheets
So now that we have our Tables configured in PowerQuery we can append the 2 (or more). Hit the Append button from the Combine group in the PowerQuery ribbon.
Next select Table1 from the first drop-down and Table2 from the second drop-down:
and hit OK
Note: When wanting to append multiple (>2) worksheets simply repeat this step. The first Table will need to be the Appended one from the remaining tables
That’s it! Similarly as with the MS Query example you can always easily refresh your query by right-clicking and hitting Refresh!
Summary
I hope you found these methods useful. On one last note I would like to share my thoughts on how these methods compare.
Personally I prefer to use MS Query (SQL) via my SQL AddIn. This sentiment may of course be partially as I used to work a lot with databases and am used to coding SQL. I know for most Excel users out there this is not the case. In such cases and if you only have a couple of Worksheets you need to merge on a regular basis I do suggest downloading the PowerQuery AddIn. It’s easy to use and also allows you to refresh your query easily. In all other scenarios feel free to use the VBA approach and simply customize your code to work best for you!
Let me know if you found this useful! And be sure to subscribe to more Tips on my Twitter or Facebook page!