Хитрости »
Основные понятия (22)Здесь собраны статьи, в которых разъясняются базовые понятия работы в Excel и VBA, а так же проблемы, с которыми сталкивается большинство начинающих
Сводные таблицы и анализ данных (5) Раздел поможет изучить сводные таблицы и научиться их использовать "на полную"
Графики и диаграммы (4) Раздел поможет научиться создавать диаграммы и графики в Excel, в том числе нестандартные
Работа с VB проектом (10) С помощью статей раздела вы научитесь создавать процедуры программно и выполнять различные операции с объектами самого VBA
Power BI и Power Query (5) Здесь собраны статьи, раскрывающие различные возможности мощнейшего инструмента для визуализаций бизнесс-процессов Power BI и надстройки для Excel Power Query
Условное форматирование (5) Этот раздел поможет поближе познакомиться с Условным форматированием на примерах различных ситуаций
Списки и диапазоны (5) Статьи, посвященные работе не только с выпадающими списками, но и с диапазонами и хитростями их применения в рабочих файлах
Макросы(VBA процедуры) (59) Статьи раздела направлены на изучение VBA с детальным разбором кодов. Множество статей с примерами кодов под всевозможные ситуации с комментариями и пояснениями
Разное (34) Собраны статьи, которые не подходят ни под одну из представленных выше категорий или входят сразу в несколько. Но эти статье не менее полезные!

Сводная таблица из нескольких листов

Как ни странно, но начиная с Excel 2007 пропала очевидная возможность создания сводной таблицы из нескольких листов. В Excel 2003 это можно было сделать во время создания простой сводной (Меню- Данные- Отчет сводной таблицы и диаграммы), выбрав в меню "Из нескольких диапазонов консолидации". Хоть на офф.сайте Microsoft для версии Excel 2007 и выше и предлагают сделать это при помощи клавиш: ALT+D+P у меня данное сочетание не вызвало никакой реакции со стороны самого Excel ни на русской раскладке, ни на английской. Скорее всего локализация ОС и Офиса так же имеет значение. Но я не стал далее ничего пытаться делать, т.к. знаю более короткий путь, чем изменение локализации. Чтобы создавать сводную из нескольких диапазонов для начала необходимо добавить кнопку на панель быстрого доступа:

  • Excel 2010- Файл (File)- Параметры (Options)- Панель быстрого доступа (Quick Access Toolbar)
  • Excel 2007- Кнопка офис- Параметры Excel (Excel options)- Панель быстрого доступа (Quick Access Toolbar)

или непосредственно с панели быстрого доступа:

Выбрать команды из: Все команды (All Commands). Ищем там Мастер сводных таблиц и диаграмм (PivotTable and PivotChart Wizard) и переносим на панель быстрого доступа:

Конечно, это совсем не та сводная, что на основе одного листа: нет толковых и понятных заголовков столбцов; набор функций ограничен; да и вообще функционал скуден по сравнению с обычной сводной(например, нет группировки дат и значений). Может быть поэтому в Microsoft посчитали правильным убрать данный пункт с глаз, чтобы не вводить в заблуждение.


Но тем не менее, несмотря на все недочеты, для кого-то возможность создания подобных таблиц может оказаться очень даже полезной. Например, если необходимо проанализировать данные по продажам за несколько лет и каждый год на отдельном листе или в отдельном диапазоне, как на рисунке ниже:

Жмем кнопочку, которую мы так старательно создали на панели быстрого доступа.
На Первом шаге необходимо указать в нескольких диапазонах консолидации (Multiple consolidation ranges)

Далее на Втором шаге Excel предложит создать одно поле страницы или создать свои поля страниц. Т.к. Excel как правило создает весьма малопонятные наименования для полей страниц по умолчанию, лучше выбрать второй пункт - Создать поля страницы (I will create the page fields).

Правда, создать можно будет не более 4-х полей страниц, но как правило для большинства задач этого вполне хватает. К тому же нам это потребуется лишь для того, чтобы задать понятные наименования для полей страницы. А уж для этого 1-го поля за глаза хватит.

Третьим шагом необходимо будет указать все диапазоны, из которых планируется создать сводную (диапазоны могут быть как на одном листе, так и на разных листах и даже в разных книгах):

Количество полей страниц указываем 1 (How mane page fields do you want?). Становится активным окно для указания имени поля (Field one). Даем имена для полей, поочередно выделяя их в списке диапазонов:
Лист3!$A$2:$N$6 - указываем 2013 год;Лист3!$A$8:$N$11 - указываем 2012 год;Лист3!$A$13:$N$17 - указываем 2011 год.

Жмем Далее (Next), выбираем место создания сводной таблицы(существующий или новый лист), Готово (Finish).
Получаем более-менее привычный вид сводной таблицы:

Я бы выделил две небольшие проблемы:

  1. Например на рисунке выше столбец Менеджер расположен в области значений и нет возможности перенести его в область строк или столбцов. Можно лишь убрать его из отображения, выключив в фильтре поля Столбец. Все дело в том, что сводные таблицы, созданные на основе нескольких диапазонов консолидации, содержат только три базовых поля: Строка, Столбец и Значение. Поле Строка всегда создается на основе первого столбца указанного диапазона и может содержать только одну область. Поле Столбец содержит все, что расположено правее первого столбца и комбинирует столбцы всех диапазонов в одно поле заголовков.
  2. Тот же столбец Менеджер содержит значения по количеству, но не суммы, т.к. это текстовые поля. Именно из-за этого значения для остальных столбцов тоже отражены не суммами, а количеством. Это легко изменить, поменяв формат ячеек. В этом случае столбец Менеджер будет содержать нули. Но главная особенность в том, что этот столбец трактуется сводной изначально как значения и не может содержать текст. А это значит, что нет никакой возможности узнать значения из таблицы исходных данных.

Эти моменты следует учитывать при подготовке данных для построения сводной таблицы на основе нескольких диапазонов консолидации.

А на рисунке ниже показано для чего мы давали имена полям:

Имена элементов соответствуют тем значениям, которые мы задали на третьем шаге: 2011 год, 2012 год, 2013 год.
Если бы на втором шаге мы выбрали Создать одно поле страницы (Create a single page field for me), то получили бы малопонятные названия в фильтре Страниц (Объект1(Item1), Объект2(Item2), Объект3(Item3)):

Сами же поля страниц можно использовать для более гибкого анализа. Например, поле Страница1 (Page1) может быть перемещено в область строк для анализа данных наглядно по годам:

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

Подводя итог можно с уверенностью сказать, что совершенно не напрасно этот пункт был убран из основного меню создания сводных. Т.к. полноценной сводной это назвать нельзя даже с натяжкой. И полноценный анализ при помощи данной таблицы сделать вряд ли удастся. Но тем не менее возможность создания такой сводной все же лучше, чем ничего.
Хотя я сам обычно советую сначала применить некий код (вроде того, что описан в статье Как собрать данные с нескольких листов или книг?), после чего на основе собранных данных создать нормальную сводную таблицу со всеми её возможностями и полным функционалом. Или действовать через базы данных(особенно, если данных очень много): Сводная из базы данных Access


СОЗДАНИЕ ПОЛНОЦЕННОЙ СВОДНОЙ ТАБЛИЦЫ ИЗ НЕСКОЛЬКИХ ЛИСТОВ
Но есть и более экзотический метод создания сводной из нескольких листов - через подключения. Создается подключение на языке запросов SQL, запрос подсовываем в кэш сводной - и готово, у нас есть сводная из нескольких листов со всем её функционалом.

Я специально привел пример именно с ODBC. Если строить на основе ADO(в сводную можно подставить результат запроса через ADO), то сводная хоть и будет полноценной, но при любом изменении в источнике данных придется перестраивать сводную заново. Что не очень удобно, если данных много и уже свою структуру сводной построили.
А такая сводная(через ODBC) имеет прямую связь с источником данных, т.к. подключение хранится в кэше сводной. Поэтому если данные на листах изменятся - надо будет лишь стандартно обновить сводную:

  • выделить любую ячейку сводной таблицы→Правая кнопка мыши→Обновить(Refresh)
  • или вкладка Данные(Data)→Обновить все(Refresh all)→Обновить(Refresh).

Пара важных замечаний(ложек дегтя, если угодно):

  1. таблицы на листах должны иметь все перечисленные в запросе столбцы. Столбцы на листах могут располагаться в разном порядке, но иметь одинаковые заголовки. Если на одном листе заголовок столбца называется "Сумма", а на другом "Sum" - будет ошибка. Вы можете сами регулировать порядок столбцов и их кол-во, перечисляя их в запросе. За это отвечает строка:
    sCols = "[Отделение],[Статья Расходов],[Сумма]"
    Если в одном из листов будет отсутствовать какой-либо столбец - получите ошибку.
    Если указать
    sCols = "*"
    То в сводную будут включены все столбцы таблиц на листах, что избавляет от процедуры их перечисления. Но в данном случае есть свои нюансы: все таблицы на листах могут иметь различное кол-во строк, но столбцы должны быть строго одинаковые - по кол-ву и по порядку. Иными словами шапка должна быть полностью идентична на всех листах. Если на каком-то листе будет лишний столбец - получите ошибку. Если на каком-то листе будет отсутствовать столбец - получите ошибку. Если имена столбцов где-то различаются - получите ошибку.
  2. заголовки не должны содержать запятых, точек и прочих знаков препинания. Лучше использовать исключительно пробел и нижнее подчеркивание. Так же лучше давать короткие имена заголовков.
  3. лучше заголовки располагать в первой строке. Так же, как и для стандартной сводной - не должно быть объединенных ячеек.
  4. на листах не должно быть пустых строк и столбцов. Что имеется ввиду: если на листе нажать Ctrl+End, то выделяется последняя заполненная ячейка листа. По-хорошему это должна быть последняя ячейка таблицы данных. Если при нажатии на Ctrl+End выделяется пустая ячейка правее или(и) ниже таблицы данных - следует удалить эти пустые столбцы справа и строки снизу и сохранить файл.
  5. На листах не должно быть лишних таблиц. На одном листе должна быть только одна таблица.
  6. Лист для создания сводной таблицы должен находиться на первом листе. Если есть желание расположить его на каком-то другом, то надо в строке кода:
    Set rRes = ThisWorkbook.Sheets(1).Cells
    заменить 1 на номер листа для расположения сводной таблицы.

Количество строк в таблицах значения не имеет - оно может быть разным.
В прикрепленном файле я добавил процедуру обновления кэша без построения сводной заново. Может пригодиться, если подключение по каким-то причинам сбилось.
Скачать пример:

  Tips_PT_PTFromMultipleSheets.xls (54,0 KiB, 3 002 скачиваний)


Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Поиск по меткам

Access Multex Outlook Power BI Power Query и Power BI VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Настройка Поиск данных Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны акции MulTEx вебинар ссылки статьи тренинг
Обсуждение: оставлено 37 коммент.
  1. Катя Л:

    Да, вспомнила,что так можно,спасибо. Сейчас не могу добавить два поля и сделать подсуммирование по полям Сумма и Кол-во,тн.
    'выставляем первоначальные настройки для сводной
    With .PivotFields(1)
    .Orientation = xlRowField
    .Position = 1
    End With
    With .PivotFields(2)
    .Orientation = xlRowField
    .Position = 2
    End With
    .AddDataField .PivotFields("Коэф-т"), "Среднее по полю Коэф-т", xlAverage
    End With

  2. Александр:

    Есть проблема в том, что если есть полностью одинаковая строка, то она не подтянется в сводную, так как такое свойство Select. Но можно создать доп столбец с цифрами от 1 до бесконечности, тогда каждая строка будет уникальная. Автор, можно диапазон определять Диспечером имен - это бы избавило от проблемы в определении диапазона когда есть пустые значения или строки.

  3. Александр:

    Коллеги, помогите изменить код так, что бы можно было работать с Диспетчером имен, так как у меня часть столбцов могут быть пустыми и диапазон определяется не правильно

  4. Андрей:

    Добрый день!
    Очень нужная обработка, но столкнулся с проблемой.
    "Поле исходных данных содержит больше уникальных элементов, чем может быть использовано в отчете сводной таблицы"
    Прошу помочь!
    P.s При сохранения всех листов в один массив, сводная Excel справляется без проблем!

  5. Katerina:

    Здравствуйте, выдает ошибку тут
    ThisWorkbook.Worksheets(avSheets).Copy

    все имена правильно ввела, даже скопировала специально. в чем проблема?

    • Katerina:

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

      • Катерина, я на вскидку могу только одну причину назвать: числа не являются числами и записаны как текст. В этом случае сводная не сможет подвести сумму таких "чисел" - может только подсчитать их кол-во.

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Логин
Наши партнеры
Перейти
Перейти
Счетчики
Анализ сайта

Яндекс.Метрика
© 2016 Excel для всех  Войти