Сводная таблица по нескольким диапазонам данных
Постановка задачи
Сводные таблицы - один из самых замечательных инструментов в Excel. Но до сих пор, к сожалению, ни одна из версий Excel не умеет "на лету" делать такой простой и нужной вещи как построение сводной по нескольким исходным диапазонам данных, находящимся, например, на разных листах или в разных таблицах:
Прежде, чем начать давайте уточним пару моментов. Априори я полагаю, что в наших данных выполняются следующие условия:
- Таблицы могут иметь любое количество строк с любыми данными, но обязательно - одинаковую шапку.
- На листах с исходными таблицами не должно быть лишних данных. Один лист - одна таблица. Для контроля советую использовать сочетание клавиш Ctrl+End, которое перемещает вас на последнюю использованную ячейку листа. В идеале - это должна быть последняя ячейка таблицы с данными. Если при нажатии на Ctrl+End выделяется какая-либо пустая ячейка правее или ниже таблицы - удалите после таблицы эти пустые столбцы справа или строки снизу и сохраните файл.
Способ 1. Сборка таблиц для сводной с помощью Power Query
Начиная с 2010 версии для Excel существует бесплатная надстройка Power Query, которая умеет собирать и трансформировать любые данные и отдавать их потом как источник для построения сводной таблицы. Решить нашу задачу с помощью этой надстройки совсем несложно.
Сначала создадим новый пустой файл в Excel - в него будет происходить сборка и в нем же потом будет создаваться сводная таблица.
Затем на вкладке Данные (если у вас Excel 2016 или новее) или на вкладке Power Query (если у вас Excel 2010-2013) выберем команду Создать запрос - Из файла - Excel (Get Data - From file - Excel) и укажем исходный файл с таблицами, которые надо собрать:
В появившемся окне выберем любой лист (не принципиально какой именно) и внизу жмем кнопку Изменить (Edit):
Поверх Excel должно открыться окно редактора запросов Power Query. В правой части окна на панели Параметры запроса удалим все автоматически созданные шаги кроме первого - Источник (Source):
Теперь мы видим общий список всех листов. Если в файле кроме листов с данными есть еще какие-то побочные листы, то на этом шаге наша задача - отобрать только те листы, с которых нужно загрузить информацию, исключив все остальные с помощью фильтра в шапке таблицы:
Удалим все столбцы, кроме колонки Data, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить другие столбцы (Remove other columns):
Затем можно развернуть содержимое собранных таблиц, щелкнув по двойной стрелке в верхней части столбца (флажок Использовать исходное имя столбца как префикс можно при этом отключить):
Если вы всё сделали правильно, то на этом моменте должны увидеть содержимое всех таблиц, собранных друг под другом:
Осталось поднять первую строку в шапку таблицы кнопкой Использовать первую строку в качестве заголовков (Use first row as headers) на вкладке Главная (Home) и удалить попавшие в данные повторяющиеся шапки таблиц с помощью фильтра:
Сохраним всё проделанное с помощью команды Закрыть и загрузить - Закрыть и загрузить в... (Close & Load - Close & Load to...) на вкладке Главная (Home), а в открывшемся окне выберем опцию Только подключение (Connection Only):
Всё. Осталось только построить сводную. Для этого идём на вкладку Вставка - Сводная таблица (Insert - Pivot Table), выбирыем опцию Использовать внешний источник данных (Use external data source), а затем, нажав кнопку Выбрать подключение, наш запрос. Дальнейшее создание и настройка сводной происходит совершенно стандартным образом путем перетаскивания нужных нам полей в области строк, столбцов и значений:
Если в будущем изменятся исходные данные или добавится еще несколько листов-магазинов, то достаточно будет обновить запрос и нашу сводную с помощью команды Обновить все на вкладке Данные (Data - Refresh All).
Способ 2. Объединяем таблицы SQL-командой UNION в макросе
Еще одно решение нашей задачи представлено вот таким макросом, который создает набор данных (cache) для сводной таблицы, используя команду UNION языка запросов SQL. Эта команда объединяет таблицы со всех указанных в массиве SheetNames листов книги в единую таблицу данных. То есть вместо физического копирования-вставки диапазонов с разных листов на один мы делаем то же самое в оперативной памяти компьютера. Потом макрос добавляет новый лист с заданным именем (переменная ResultSheetName) и создает на нем полноценную(!) сводную на основе собранного кэша.
Чтобы воспользоваться макросом используйте кнопку Visual Basic на вкладке Разработчик (Developer) или сочетание клавиш Alt+F11. Затем вставляем новый пустой модуль через меню Insert - Module и копируем туда следующий код:
Sub New_Multi_Table_Pivot() Dim i As Long Dim arSQL() As String Dim objPivotCache As PivotCache Dim objRS As Object Dim ResultSheetName As String Dim SheetsNames As Variant 'имя листа, куда будет выводиться результирующая сводная ResultSheetName = "Сводная" 'массив имен листов с исходными таблицами SheetsNames = Array("Альфа", "Бета", "Гамма", "Дельта") 'формируем кэш по таблицам с листов из SheetsNames With ActiveWorkbook ReDim arSQL(1 To (UBound(SheetsNames) + 1)) For i = LBound(SheetsNames) To UBound(SheetsNames) arSQL(i + 1) = "SELECT * FROM [" & SheetsNames(i) & "$]" Next i Set objRS = CreateObject("ADODB.Recordset") objRS.Open Join$(arSQL, " UNION ALL "), _ Join$(Array("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=", _ .FullName, ";Extended Properties=""Excel 8.0;"""), vbNullString) End With 'создаем заново лист для вывода результирующей сводной таблицы On Error Resume Next Application.DisplayAlerts = False Worksheets(ResultSheetName).Delete Set wsPivot = Worksheets.Add wsPivot.Name = ResultSheetName 'выводим на этот лист сводную по сформированному кэшу Set objPivotCache = ActiveWorkbook.PivotCaches.Add(xlExternal) Set objPivotCache.Recordset = objRS Set objRS = Nothing With wsPivot objPivotCache.CreatePivotTable TableDestination:=wsPivot.Range("A3") Set objPivotCache = Nothing Range("A3").Select End With End Sub
Готовый макрос потом можно запустить сочетанием клавиш Alt+F8 или кнопкой Макросы на вкладке Разработчик (Developer - Macros).
Минусы такого подхода:
- Данные не обновляются, т.к. кэш не имеет связи с исходными таблицами. При изменении исходных данных надо запустить макрос еще раз и построить сводную заново.
- При изменении количества листов необходимо правки в код макроса (массив SheetNames).
Зато в итоге получаем самую настоящую полноценную сводную таблицу, построенную по нескольким диапазонам с разных листов:
Вуаля!
Техническое замечание: если при запуске макроса вы получаете сообщение об ошибке вида "Provider not registered", то скорее всего у вас 64-битная версия Excel или установлена не полная версия Office (нет Access). Чтобы исправить ситуацию замените в коде макроса фрагмент:
Provider=Microsoft.Jet.OLEDB.4.0;
на:
Provider=Microsoft.ACE.OLEDB.12.0;
И скачайте и установите бесплатный движок обработки данных из Access с сайта Microsoft - Microsoft Access Database Engine 2010 Redistributable
Способ 3. Мастер консолидации сводных таблиц из старых версий Excel
Этот способ немного устарел, но тоже стоит упоминания. Формально говоря, во всех версиях до 2003 включительно в мастере сводных таблиц была опция "построить сводную по нескольким диапазонам консолидации". Однако, отчет, построенный таким образом, к сожалению, будет лишь жалким подобием настоящей полноценной сводной и не поддерживает многие "фишки" обычных сводных таблиц:
В такой сводной нет заголовков столбцов в списке полей, нет гибкой настройки структуры, ограничен набор используемых функций и, в общем и целом, все это слабо похоже на сводную таблицу. Возможно именно поэтому начиная с 2007 года Microsoft эту функцию убрали из стандартного диалога при создании отчетов сводных таблиц. Теперь эта возможность доступна только через настраиваемую кнопку Мастер сводных таблиц (Pivot Table Wizard), которую при желании можно добавить на панель быстрого доступа через Файл - Параметры - Настройка панели быстрого доступа - Все команды (File - Options - Customize Quick Access Toolbar - All Commands):
После нажатия на добавленную кнопку нужно выбрать на первом шаге мастера соответствующую опцию:
А затем в следующем окне выделить по очереди каждый диапазон и добавить его в общий список:
Но, повторюсь, это не полноценная сводная, так что не ждите от нее слишком многого. Подобный вариант могу рекомендовать только в очень простых случаях.
Ссылки по теме
- Создание отчетов с помощью сводных таблиц
- Настройка вычислений в сводных таблицах
- Что такое макросы, как их использовать, куда копировать код на VBA и т.д.
- Сбор данных с нескольких листов на один (надстройка PLEX)
Могли бы Вы пожалуйста подсказать как настроить в сводной таблице формат времени.
мне нужно проанализировать данные со временем, с этим проблемка( подскажите если не трудно.
спасибо заранее
на:
Provider=Microsoft.ACE.OLEDB.12.0;
И скачайте и установите бесплатный движок обработки данных из Access с сайта Microsoft -
Есть ли иной способ решения проблемы, кроме как создавать новый запрос?
Как на ios Microsoft Mac Excel версия 16.20 сделать подключение к внешнему источнику данных ?
Насколько могу судить, сам не пробовал, для версии Mac Excel 2011 это можно сделать только при помощи ODBC-драйверов от сторонних разработчиков. Это стоит денег.
Но, как отмечают, это возможно при использовании версии Mac Excel 2016 при подключении к SQL Server только. К другим источникам, опять-таки, при помощи ODBC-драйверов от сторонних разработчиков.
ADODB is NOT supported in Mac Excel 2011, but ODBC works in conjunction with a 3rd party driver.
HOWEVER, as noted, if you're using Excel 2016 for Mac, you can do it:
This version of Excel does provide an ODBC driver for connecting to SQL Server Databases. On the Data tab, click New Database Query > SQL Server ODBC. Then use the dialog boxes to import the data...
Например, если во вкладке "Лист1" Столбцы с данными "артикул" и "наименование", а во вкладке "Лист2" сначала "наименование", а потом "артикул", то макрос не корректно собирает данные.
У меня вопрос, когда создаю сводную таблицу из нескольких разных таблиц(на разных листах) расположенных в пределах одного документа, и сохраняю ее на этом же документе, при передаче этого документа на другой сервер сводная таблица перестает обновляться и теряет свое предназначение в целом.
Поэтому, приходится делать сводную таблицу одного документа отдельным документом. И тогда при передаче на другой сервер все работает. Но это очень неудобно.
Помоги пожалуйста разобраться в этой проблеме.
Спасибо.
Я использовала Power Query для постороения сводной таблицы из разных диапазонов. Причем диапазоны и сводная таблица расположены в одном файле. Все отлично.
НО каждый месяц я добавляю в один диапазон новые данные за текущий период и ,к сожалению, никак не могу обновить сводную. Нажимаю - обновить все -новый период не появляется.
Может здесь какие-то еще нъюансы для обновления сводной ?
Спасибо за ответ.
Я правильно понимаю,что на сегодняшний день (Апрель 2020) самая оптимальная технология для связывания в одной сводной таблице данных из разных таблиц это создание модели данных и Pivot Table?
Альтернативы - это слияние запросов через Power Query или ВПР
1.на каждом листе разные таблицы.
2.в каждой таблице совпадает только одно название первого столбца.
3.количество столбцов и строк разное (например на первом листе таблица мест, второй таблица вида работ и т.д.).
4.сопоставить данные одной таблицы с другой можно только через номер в первом столбце.
5.номер в первом столбце может быть как только в одной таблице, так и в двух или во всех.
PS: EXEL 2016
У меня проблема разрешилась после удаления фильтра в "шапке" (на листах расположены "диапазоны", т.к. динамич.таблицы не позволяют работать в режиме совместного доступа (старая версия)). Благо, количество строк на каждом листе небольшое, а вот если бы было "поболя", то отсутствие фильтра намного бы испортило удовольствие)).
У меня Excel 2016. Стала делать сводную таблицу на своих рабочих таблицах способом №1. Дошла до шага формирования самой сводной таблицы и выскакивает ошибка "[Expression.Error] Ключу не соответствует ни одна строка в таблице". Подскажите, пожалуйста, что я не так сделала.