Хитрости »
Основные понятия (22)
Сводные таблицы и анализ данных (7)
Графики и диаграммы (5)
Работа с VB проектом (11)
Power BI и Power Query (11)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (62)
Разное (37)

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

Как ни странно, но начиная с 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 903 скачиваний)


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

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

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

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

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

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

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

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

    0
  4. Андрей:

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

    0
  5. Katerina:

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

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

    0
    • Katerina:

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

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

        0
  6. Алексей:

    Добрый день.
    Помогите, подскажите, пожалуйста, чайнику в VBA: добавил модуль, скопировал макрос, заменил в Array (...) свои названия листов. шапку проверил и даже закопипастил, чтобы не ошибиться в символах, пустые ячейки (вправои вниз) удалил. Не срабатывает макрос все равно. При запуске выделяет синим DelCon (в этой If Val(Application.Version) > 11 Then DelCon строке). и вверху строка с названием макроса закрашивается желтым. Что у меня не так? Что я делаю неправильно?

    0
    • Алексей, скорее всего код скопировали не полностью. Не скопировали процедуру DelCon. Сравните код статьи(ВЕСЬ) и свой код.
      А если бы Вы привели текст ошибки - я мог бы ответить точнее. А так только догадки...

      0
      • Алексей:

        Точно (знаю же что должно заканчиваться End Sub...).
        Добавил остаток кода, запустил. Тоже самое. Ошибка-Compile Error: Sub or Function not defined.

        0
        • Это означает, что функция DelCon НЕ НАЙДЕНА. Посмотрите внимательно на весь код. Не просто End Sub - у Вас целой функции не хватает. Последние три строки кода.

          0
  7. Сергей:

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

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

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


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

Тренинги

Заказать
Наши партнеры
Перейти
Перейти
Счетчики
Анализ сайта

Яндекс.Метрика
© 2017 Excel для всех  Войти
Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
captcha
Генерация пароля