Excel предоставляет широкие возможности для сбора, хранения и обработки большого объема данных. Однако с уверенностью можно сказать, что данные – это еще не все. Важно также способность и наличие возможности группировки значений данных, чтобы можно было получать какую-то информацию и презентовать ее в удобный вид для визуального анализа. Именно для реализации решений такого рода задач и служат сводные таблицы Excel. А если для создания сводных таблиц использовать макрос, получим неограниченные возможности.
Создание сводных таблиц макросом
Источник информации для сводных таблиц всегда один и тот же – база данных. Набор данных образующих базу для обработки в Excel может быть не только на листах рабочей книги, а также и во внешних источниках.
Для описания способа создания сводных таблиц средствами процедур VBA будет использоваться таблица, которая содержит данные по месяцам о оборотах семи магазинов фирмы за последние несколько лет деятельности.
Тестовая база для примера состоит из сгруппированных данных в 21 строке. Благодаря использованию сводных таблиц можно в читабельный вид презентовать изменение данных и извлечь соответственные результаты анализа.
Список данных по каждому месяцу определенного года содержит информацию о размере оборотов в отдельных магазинах фирмы. В таблице включен режим автофильтра, чтобы упростить на сколько возможно предварительный визуальный анализ данных.
С помощью макроса VBA создадим из этого большого объема данных читабельный и удобный для визуального анализа отчет в виде сводной таблице. Нам нужна сводная таблица отчета, в котором без труда можно прочитать интересующую нас информацию без визуального анализа сотен строк в исходной базе данных.
В данном примере создание сводной таблицы VBA-макросом будет достаточно простым. Простота решения будет достигнута за счет симуляции использования подобных параметров и действий, которые предоставляет к распоряжению мастер сводных таблиц в Excel. Используя экземпляр объекта PivotCaches запишем настройки своей сводной таблицы присвоив ей определенное имя. Это позволит потом непосредственно ссылаться на сводную таблицу в любой части кода. Для создания сводной таблицы используя макрос будем использовать метод PivotTableWizard. На этом же шаге будем использовать возможности объекта PivotFields, в котором определим структуру сводной таблицы с учетом исходных данных источника.
Написание кода макросов в Excel всегда начинается с открытия VBA-редактора (ALT+F11): «РАЗРАБОТЧИК»-«Код»-«Visual Basic».
Затем создадим модуль где будет храниться исходный код. Для этого выберите инструмент в редакторе VBA: «Insert»-«Module». В появившемся окне модуля введите следующий VBA-код макроса:
Sub CreateTableM()
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:="Лист1!A1:D21").CreatePivotTable TableDestination:="", TableName:="ТаблицаМ"
With ActiveSheet
.Name = "Анализ"
.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
End With
With ActiveSheet.PivotTables("ТаблицаМ")
.SmallGrid = True
.PivotFields("Оборот").Orientation = xlDataField
.PivotFields("Год").Orientation = xlPageField
.PivotFields("Месяц").Orientation = xlRowField
.PivotFields("Магазины").Orientation = xlColumnField
End With
End Sub
Теперь достаточно лишь запустить макрос выбрав инструмент: «РАЗРАБОТЧИК»-«Код»-«Макросы»-«CreateTableM»-«Выполнить»:
В результате будет автоматически сгенерированная сводная таблица с помощью макроса.
Описание VBA-кода макроса для создания сводной таблицы Excel
Данный исходный код макроса позволяет автоматически сгенерировать сводную таблицу, такую же как показано на рисунке 4. Первая строка кода выглядит весьма необычно, но жизненно необходима для дальнейшей работы программы. Она содержит набор базовых параметров для коллекции PivotCaches, которые будут применены к создаваемой сводной таблице. В первом свойстве SourceType объявляется источник для загрузки данных в бедующую сводную таблицу. Параметр xlDatabase говорит нам о том, что исходные данные берутся с рабочего листа Excel.
Используя свойство SourceData задаем ссылку на диапазон ячеек, в котором находиться исходные данные предназначенные для последующей обработки. Указывая адрес ссылки в форме Лист1!A1:D21, мы определяем целый диапазон таблицы с исходными данными включая ее заголовки столбцов. Оба свойства (SourceType и SourceData) являются здесь аргументами для метода Add, который выполняет функцию сбора информации – аналогично инструкциям выполняемых при работе с мастером сводных таблиц. Функция создания сводной таблицы реализуется методом .CreatePivotTable, для которого так же необходимо указать следующие параметры.
Свойство TanleDestination позволяет установить место для вставки будущей сводной таблицы. Если есть необходимость вставить таблицу в конкретном месте выбранного листа, тогда следует указать здесь адрес ячейки для вставки. А если же необходимо создать сводную таблицу на новом листе, тогда достаточно указать пустую строку (“”) в качестве параметра. С помощью свойства TableName присваиваем внутреннее имя будущей таблицы, в данном примере это «ТаблицаМ». Обратите внимание, что название таблицы отличается от названия листа, в котором она будет находится. Благодаря присвоению внутреннего имени для создаваемой таблицы, появляется возможность отличать ее от многих других таблиц. Но самое главное преимущество – это возможность непосредственно ссылаться к таблице через имя, вместо того чтобы каждый раз указывать место и диапазон, где будет находиться сводная таблица.
Далее с помощью инструкции конструктора With собираем блок инструкций методов, свойств и параметров структуры. Все дальнейшие опции будут реализованы внутри свойства ActiveSheet. То есть будут касаться листа, в котором будет создана сводная таблица.
Свойством Name мы определяем имя для нового листа – в данном примере это имя «Анализ». Если нужно задать для нового листа имя такое же как у новой сводной таблицы (Таблица М), тогда эту задачу лучше всего реализовать именно на данном этапе написания кода макроса.
В следующей строке определяем место на новом листе, где будет сгенерирована сводная таблица. Указывая для параметра TanleDestination свойство:
ActiveSheet.Cells(3,1)
Так мы определяем, что таблица будет сгенерирована в третьей строке и в первом столбце листа. То есть в ячейке A3. Эти строки кода определяют базовую информацию о сводной таблице. Закрываем конструктор инструкцией End With.
Читайте также: Макрос для настройки полей и форматирования сводной таблицы.
В следующих строках кода можно определить в каких полях должны находиться отобранные данные из исходной таблицы. Эта часть исходного кода должна начинаться с очередной инструкции конструктора With и заканчиваться инструкцией End With. А внутри конструктора указываться все параметры полей сводной таблицы.
Макрос представляет собой последовательность действий, которая записана и сохранена для дальнейшего использования. Сохраненный макрос можно воспроизвести по специальной команде. Другими словами, вы можете записать свои действия в макросе, сохранить его, а затем разрешить другим пользователям воспроизводить сохраненные в макросе действия простым нажатием клавиши. Это особенно удобно при распространении отчетов сводных таблиц. [1]
Предположим, вы хотите предоставить своим клиентам возможность группировать отчеты сводных таблиц по месяцам, кварталам и годам. Технически процесс группирования может выполнить любой пользователь, но некоторые из ваших клиентов не сочтут нужным разбираться в этом. В подобном случае можно записать один макрос группирования по месяцам, другой — по кварталам и третий — по годам. Затем создайте три кнопки — по одной на каждый макрос. Тогда вашим клиентам, не имеющим опыта работы со сводными таблицами, потребуется лишь щелкнуть на кнопке, чтобы должным образом сгруппировать отчет сводной таблицы.
Главное преимущество использования макросов в отчетах сводных таблиц состоит в предоставлении клиентам возможности быстро выполнять в сводных таблицах такие операции, которые они не могут выполнить в обычной ситуации. Благодаря этому существенно повышается эффективность анализа предоставляемых данных.
Скачать заметку в формате Word или pdf, скачать архив с примерами (внутри файл Excel с макросами; политика провайдера не позволяет напрямую загрузить файл такого формата на сайт).
Запись макроса
Взгляните на сводную таблицу, показанную на рис. 1. Можно обновить эту сводную таблицу, щелкнув внутри нее правой кнопкой мыши и выбрав команду Обновить. Если во время обновления сводной таблицы вы записывали действия в виде макроса, то вы или любой другой пользователь сможете воспроизвести эти действия и обновить сводную таблицу в результате запуска макроса.
Рис. 1. Запись действий во время обновления этой сводной таблицы позволит в дальнейшем обновлять данные в результате запуска макроса
Первый этап в записи макроса — это вызов диалогового окна Запись макроса. Перейдите на вкладку Разработчик ленты и щелкните на кнопке Запись макроса. (Если вы не можете отыскать на ленте вкладку Разработчик, выберите вкладку Файл, и щелкните на кнопке Параметры. В появившемся диалоговом окне Параметры Excel выберите категорию Настройка ленты и в расположенном справа списке установите флажок Разработчик. В результате на ленте появится вкладка Разработчик.) Альтернативный способ начать записывать макрос – щелкнуть на кнопке (рис. 2).
Рис. 2. Запуск записи макроса
В диалоговом окне Запись макроса введите следующую информацию о макросе (рис. 3):
Имя макроса. Имя должно описывать действия, выполняемые макросом. Имя должно начинаться с буквы или знака подчеркивания; не должно содержать пробел и другие недопустимые знаки; не должно совпадать со встроенным именем Excel или именем другого объекта в книге.
Сочетание клавиш. В это поле можно ввести любую букву. Она станет частью комбинации клавиш, которая будет использоваться для воспроизведения макроса. Комбинацию клавиш задавать необязательно. По умолчанию в качестве начала комбинации предлагается только Ctrl. Если вы хотите, чтобы комбинация включала также Shift, набирайте букву в окне удерживая нажатой клавишу Shift
Сохранить в. Здесь указывается место хранения макроса. Если вы собираетесь распространять отчет сводной таблицы среди других пользователей, выберите параметр Эта книга. Excelтакже позволяет сохранить макрос в Новой книге или в Личной книге макросов.
Описание. В это поле вводится описание создаваемого макроса.
Рис. 3. Настройка окна Запись макроса
Поскольку макрос обновляет сводную таблицу, выберите имя ОбновлениеДанных. Можно также назначить макросу комбинацию клавиш Ctrl+Shift+Q. Помните, что после создания макроса вы будете использовать эту комбинацию клавиш для его запуска. В качестве места хранения макроса выберите параметр Эта книга и щелкните ОК.
После щелчка в диалоговом окне Запись макроса на кнопке ОК начинается запись макроса. На этом этапе все выполняемые вами действия в Excel будут регистрироваться.
Щелкните правой кнопкой мыши в области сводной таблицы и выберите команду Обновить (как на рис. 1, но уже в режиме записи макроса). После обновления сводной таблицы можно остановить процесс записи макроса с помощью кнопки Остановить запись вкладки Разработчик. Или повторно щелкните на кнопке, изображенной на рис. 2.
Итак, вы только что записали свой первый макрос. Теперь можете выполнить макрос с помощью комбинации клавиш Ctrl+Shift+Q.
Предупреждение о безопасности макросов. Следует отметить, что в случае записи макросов пользователем они будут выполняться без каких-либо ограничений со стороны подсистемы безопасности. Тем не менее при распространении рабочей книги, содержащей макросы, необходимо предоставить другим пользователям возможность удостовериться, что никакого риска в открытии рабочих файлов нет, а выполнение макросов не приведет к заражению системы вирусами. В частности, вы сразу же заметите, что файл примера, используемый в этой главе, не будет полноценно функционировать, если специально не разрешить Excel выполнять в нем макросы.
Самый простой способ обеспечить безопасность макросов — создать надежное расположение — папку, в которую будут помещаться только «надежные» рабочие книги, не содержащие вирусов. Надежное расположение позволяет вам и вашим клиентам выполнять макросы в рабочих книгах без каких-либо ограничений со стороны подсистемы безопасности (такое поведение сохраняется до тех пор, пока рабочие книги находятся в доверительной папке).
Чтобы настроить надежное расположение, выполните следующие действия.
Выберите вкладку ленты Разработчик и щелкните на кнопке Безопасность макросов. На экране появится диалоговое окно Центр управления безопасностью.
Выберите категорию Надежные расположения.
Щелкните на кнопке Добавить новое расположение.
Щелкните на кнопке Обзор, чтобы указать папку для рабочих файлов, которым вы доверяете.
После указания надежного расположения для всех находящихся в нем рабочих книг будут по умолчанию выполняться произвольные макросы.
В Excel 2013 модель обеспечения безопасности была усовершенствована. Теперь файлы рабочих книг, которым ранее было «оказано доверие», запоминаются, т.е. после открытия книги Excel и щелчка на кнопке Включить содержимое Excel запоминает это состояние. В результате эта книга попадает в разряд доверенных, и лишние вопросы при ее последующем открытии не задаются.
Создание пользовательского интерфейса с помощью элементов управления формы
Запуск макроса с помощью комбинации клавиш Ctrl+Shift+Q поможет в том случае, когда в отчете сводной таблицы имеется лишь один макрос. (К тому же пользователи должны знать эту комбинацию.) Но предположим, что вы хотите предоставить своим клиентам несколько макросов, выполняющих разные действия. В таком случае нужно обеспечить клиентов понятным и простым способом запуска каждого макроса, не прибегая к запоминанию комбинаций клавиш. Идеальное решение — это простой пользовательский интерфейс в виде набора таких элементов управления, как кнопки, полосы прокрутки и другие средства, позволяющие выполнять макросы щелчками мышью.
Excel предлагает в ваше распоряжение набор инструментов, предназначенных для создания пользовательского интерфейса непосредственно в электронной таблице. Эти инструменты называются элементами управления формы. Основная идея заключается в том, что можно поместить элемент управления формы в электронную таблицу и назначить ему макрос, который был записан ранее. После назначения элементу управления макрос будет запускаться щелчком на этом элементе.
Элементы управления формы можно найти в группе Элементы управления формы вкладки ленты Разработчик. Чтобы открыть палитру элементов управления, щелкните в этой группе на кнопке Вставить (рис. 4).
Рис. 4. Элемент управления формы Кнопка
Обратите внимание: кроме элементов управления формы, на палитре также присутствуют Элементы ActiveX. Хоть они и похожи, программно это совершенно разные объекты. Элементы управления формы со своими ограниченными возможностями и простыми настройками специально разрабатывались для размещения на рабочих листах. В то же время Элементы ActiveX применяются преимущественно в пользовательских формах. Возьмите за правило размещать на рабочих листах исключительно элементы управления формы.
Следует выбрать элементы управления, которые лучше всего подходят для решения поставленной задачи. В рассматриваемом примере клиентам необходимо предоставить возможность обновления сводной таблицы щелчком на кнопке. Щелкните на элементе управления Кнопка, переместите указатель мыши в то место рабочего листа, где должна располагаться кнопка, и щелкните мышью.
После того как вы поместите кнопку в таблицу, откроется диалоговое окно Назначить макрос объекту (рис. 5). Выберите требуемый макрос (в нашем случае — ОбновлениеДанных, записанный ранее) и щелкните на кнопке ОК.
Рис. 5. Выберите макрос, который нужно присвоить кнопке, и щелкните на кнопке ОК. В данном случае следует применять макрос ОбновлениеДанных
После помещения всех необходимых элементов управления в отчет сводной таблицы можно отформатировать таблицу для создания базового интерфейса. На рис. 6 показан отчет сводной таблицы после форматирования.
Рис. 6. Пользовательский интерфейс
Изменение записанного макроса
В результате записи макроса программа Excel создает модуль, который хранит выполненные вами действия. Все записанные действия представляются строками VBA-кода, из которых состоит макрос. Можно добавлять в отчеты сводной таблицы различные функциональные возможности, настраивая VBA-код для получения требуемых результатов. Чтобы было легче понять, как все это работает, создадим новый макрос, выводящий пять первых записей о клиентах. Перейдите на вкладку Разработчик и щелкните на кнопке Запись макроса. Откроется диалоговое окно, показанное на рис. 7. Назовите создаваемый макрос ПервыеNзаказчиков и укажите место сохранения Эта книга. Щелкните ОК, чтобы начать запись макроса.
Рис. 7. Присвойте новому макросу имя и определите место его хранения
После того как начнете запись, щелкните на стрелке рядом с полем Имя заказчика, выберите Фильтр по значению и опцию Первые 10 (рис. 8а). В появившемся диалоговом окне задайте настройки, как показано на рис. 8б. Эти настройки указывают вывести данные пяти клиентов, лучших по объемам продаж. Щелкните ОК.
Рис. 8. Выберите фильтр (а) и настройте параметры (б), чтобы отобразить пятерку лучших клиентов по продажам
После успешной записи всех действий, требуемых для извлечения пятерки лучших клиентов по продажам, перейдите на вкладку Разработчик и щелкните на кнопке Остановить запись.
Теперь у вас имеется макрос, который будет фильтровать сводную таблицу для извлечения пятерки лучших клиентов по продажам. Необходимо сделать так, чтобы макрос реагировал на состояние полосы прокрутки, т.е. с помощью полосы прокрутки нужно иметь возможность указывать макросу количество клиентов, данные которых будут отображаться в отчете сводной таблицы. Таким образом, с помощью полосы прокрутки пользователь сможет извлекать пять лучших, восемь лучших или тридцать два лучших клиента по своему усмотрению.
Чтобы добавить в электронную таблицу полосу прокрутки, перейдите на вкладку Разработчик, щелкните на кнопке Вставить, выберите на палитре элемент управления Полоса прокрутки и расположите его на рабочем листе. Щелкните правой кнопкой мыши на элементе управления Полоса прокрутки и в контекстном меню выберите команду Формат объекта. Откроется диалоговое окно Формат элемента управления (рис. 9). В нем внесите следующие изменения в настройки: параметру Минимальное значение присвойте значение 1, параметру Максимальное значение — значение 200, а в поле Связь с ячейкой введите значение $М$2, чтобы в ячейке М2 отображалось значение полосы прокрутки. Щелкните на кнопке ОК, чтобы применить указанные ранее настройки.
Рис. 9. После включения полосы прокрутки в сводную таблицу настройте ее параметры
Теперь нужно сопоставить недавно записанный макрос ПервыеNзаказчиков с элементом управления Полоса прокрутки, находящимся на рабочем листе. Щелкните правой кнопкой мыши на элементе управления Полоса прокрутки и в контекстном меню выберите команду Назначить макрос, чтобы открыть диалоговое окно назначения макроса. Назначьте полосе прокрутки записанный макрос ПервыеNзаказчиков. Макрос будет выполняться каждый раз после щелчка на полосе прокрутки. Протестируйте созданную полосу прокрутки. После щелчка на полосе запустится макрос ПервыеNзаказчиков и изменится число в ячейке М2 для отображения состояния полосы прокрутки. Число в ячейке М2 играет важную роль, поскольку оно используется для привязки макроса к полосе прокрутки.
Единственное, что осталось сделать, — это заставить макрос обрабатывать число в ячейке М2, связывая ее с полосой прокрутки. Для этого нужно перейти к VBA-коду макроса. Для этого перейдите на вкладку Разработчик и щелкнуть на кнопке Макросы. Откроется диалоговое окно Макрос (рис. 10). В нем можно запускать, удалять и редактировать выбранный макрос. Чтобы отобразить VBA-код макроса на экране, выберите макрос и щелкните на кнопке Изменить.
Рис. 10. Чтобы получить доступ к VBA-коду макроса ПервыеNзаказчиков, выберите макрос и щелкните на кнопке Изменить
На экране появится окно редактора Visual Basic с VBA-кодом макроса (рис. 11). Ваша цель заключается в том, чтобы заменить жестко заданное в коде число 5, устанавливаемое во время записи макроса, значением в ячейке М2, которое привязано к полосе прокрутки. Изначально был записан макрос, предназначенный для отображения первых пяти заказчиков, имеющих наибольший доход.
Рис. 11. Пока в макросе жестко задано число 5
Удалите из кода число 5 и введите вместо него следующее выражение:
ActiveSheet.Range("
М2"
).Value
Добавьте в начало макроса две строки для очистки фильтров:
Range("
A4"
).Select
ActiveSheet.PivotTables("
PivotTable1"
).PivotFields("
Имя заказчика"
).ClearAllFilters
Теперь код макроса должен выглядеть так, как показано на рис. 12.
Рис. 12. Удалите жестко заданное число 5 и введите вместо него ссылку на ячейку М2
Закройте редактор Visual Basic и вернитесь к отчету сводной таблицы. Протестируйте полосу прокрутки, перетащив ползунок до значения 11. Макрос должен запуститься и отфильтровать 11 записей о лучших клиентах по продажам.
Синхронизация двух сводных таблиц с помощью одного раскрывающегося списка
Отчет, показанный на рис. 13, содержит две сводные таблицы. Каждая из них имеет поле страниц, позволяющее выбирать рынок сбыта. Проблема в том, что каждый раз при выборе рынка в поле страниц одной сводной таблицы вам приходится выбирать тот же рынок в поле страниц другой сводной таблицы. Синхронизация фильтров двух таблиц на этапе анализа данных не представляет большой проблемы, но существует вероятность, что вы или ваши клиенты все же забудут ее выполнить.
Рис. 13. Две сводные таблицы содержат поля страниц, которые выполняют фильтрацию данных по рынкам. Для анализа данных отдельного рынка нужно синхронизировать обе сводные таблицы
Один из способов синхронизации этих сводных таблиц состоит в использовании раскрывающегося списка. Идея заключается в записи макроса, который выбирает нужный рынок из поля Рынок сбыта в обеих таблицах. Затем нужно создать раскрывающийся список и заполнить его названиями рынков сбыта из двух сводных таблиц. И наконец, записанный макрос необходимо изменить для фильтрации обеих сводных таблиц, используя значения из раскрывающегося списка. Для решения этой задачи нужно выполнить следующие действия.
1. Создайте новый макрос и присвойте ему имя SynchMarkets. Когда начнется запись, выберите в поле Рынок сбыта обеих сводных таблиц рынок сбыта Калифорния и остановите запись макроса.
2. Отобразите на экране палитру элементов управления формы и добавьте на рабочий лист раскрывающийся список.
3. Создайте жестко заданный список всех рынков сводной таблицы. Обратите внимание на то, что первым элементом списка указывается значение (Все). Следует включить этот элемент, если хотите иметь возможность выбирать в раскрывающемся списке все рынки.
4. На этом этапе отчет сводной таблицы должен выглядеть так, как показано на рис. 14.
Рис. 14. В вашем распоряжении есть все требуемые средства: макрос, изменяющий поле Рынок сбыта обеих сводных таблиц, раскрывающийся список и список всех рынков сбыта, содержащихся в сводной таблице
5. Щелкните правой кнопкой мыши на раскрывающемся списке и в контекстном меню выберите команду Формат объекта, чтобы выполнить настройку элемента управления.
6. Вначале задайте исходный диапазон значений, используемый для заполнения раскрывающегося списка, как показано на рис. 15. В данном случае речь идет о списке рынков сбыта, созданном вами в п. 3. Затем укажите ячейку, отображающую порядковый номер выбранного элемента (в данном примере таковой является ячейка Н1). Параметр Количество строк списка определяет, сколько строк будет одновременно отражаться в ниспадающем списке. Щелкните на кнопке ОК.
Рис. 15. Настройки раскрывающегося списка должны указывать на список рынков сбыта как на исходный диапазон значений, а в качестве точки привязки — определять ячейку Н1
7. Теперь у вас появилась возможность выбирать в раскрывающемся списке рынок сбыта, а также определять связанный с ним порядковый номер в ячейке Н1 (рис. 16). Возникает вопрос: зачем вместо реального имени рынка используется его индексное значение? Потому что раскрывающийся список возвращает не имя, а номер. Например, при выборе в раскрывающемся списке имени Калифорния в ячейке Н1 появляется значение 5. Это означает, что Калифорния является пятым элементом списка.
Рис. 16. Раскрывающийся список теперь заполняется названиями рынков, и в ячейке Н1 выводится порядковый номер выбранного рынка
8. Чтобы использовать порядковый номер вместо имени рынка, вам следует передать его с помощью функции ИНДЕКС.
9. Введите функцию ИНДЕКС, которая преобразует порядковый номер из ячейки Н1 в понятное значение.
10. Функция ИНДЕКС принимает два аргумента. Первый аргумент представляет диапазон значений списка. В большинстве случаев вы будете использовать тот же диапазон, которым заполняется раскрывающееся меню. Второй аргумент — это порядковый номер. Если порядковый номер вводится в ячейке (например, в ячейке Н1, как на рис. 17), то можете просто сослаться на эту ячейку.
Рис. 17. Функция ИНДЕКС в ячейке I1 преобразует порядковый номер, хранящийся в ячейке Н1, в значение. Вы будете использовать значение в ячейке I1 для изменения макроса
11. Отредактируйте макрос SynchMarkets, используя значение в ячейке I1 вместо жестко заданного значения. Перейдите на вкладку Разработчик и щелкните на кнопке Макросы. На экране появится диалоговое окно, показанное на рис. 18. Выберите в нем макрос SynchMarkets и щелкните на кнопке Изменить.
Рис. 18. Чтобы получить доступ к VBA-коду макроса, выберите макрос SynchMarkets и щелкните Изменить
12. При записи макроса вы выбрали в обеих сводных таблицах рынок сбыта Калифорния из поля Рынок сбыта. Как видно из рис. 19, рынок Калифорния теперь жестко задан в VBA-коде макроса.
Рис. 19. Рынок сбыта Калифорния жестко задан в VBA-коде записанного макроса
13. Замените значение "
Калифорния"
выражением Activesheet.Range("
I1"
).Value, которое ссылается на значение в ячейке I1. На этом этапе код макроса должен выглядеть так, как показано на рис. 20. После изменения макроса закройте редактор Visual Basic и вернитесь к электронной таблице.
Рис. 20. Замените значение "
Калифорния"
выражением ActiveSheet.Range("
I1"
).Value и закройте редактор Visual Basic
14. Осталось только обеспечить выполнение макроса при выборе рынка сбыта в раскрывающемся списке. Щелкните правой кнопкой мыши на раскрывающемся списке и выберите параметр Назначить макрос. Выберите макрос SynchMarket и щелкните на кнопке ОК.
15. Скройте строки и столбцы с полями страниц в сводных таблицах, а также созданный вами список рынков и формулы индекса.
На рис. 21 показан окончательный результат. Вы получили пользовательский интерфейс, позволяющий клиентам выбирать рынок сбыта в обеих сводных таблицах с помощью единственного раскрывающегося списка.
Рис. 21. Отчет сводной таблицы, готовый к использованию
При выборе в раскрывающемся списке нового элемента размеры столбцов автоматически изменяются, чтобы вместить все отображаемые в них данные. Подобное поведение программы порядком надоедает при форматировании шаблона рабочего листа. Можно предотвратить его, если щелкнуть на сводной таблице правой кнопкой мыши и выбрать команду Параметры сводной таблицы. На экране появится одноименное диалоговое окно, в котором необходимо сбросить флажок Автоматически изменять ширину столбцов при обновлении.
Приведенный алгоритм синхронизации двух сводных таблиц с помощью одного раскрывающегося списка интересен, пожалуй, только как учебный пример. В реальной жизни одновременное управление фильтрами нескольких сводных таблиц проще всего реализовать с помощью среза (рис. 22), одновременно подключенного к нескольким сводным таблицам (подробнее см. Excel 2013. Срезы сводных таблиц; создание временной шкалы).
Рис. 22. Управление фильтрами нескольких сводных таблиц с помощью среза
[1] Заметка написана на основе книги Джелен, Александер. Сводные таблицы в Microsoft Excel 2013. Глава 12.
Запись макроса для создания сводной таблицы
В прошлом часе мы записали макрос
(строящий диаграмму), код которого
послужил основой для созданной затем
процедуры. Такой же подход используется
и в этом часе. Сейчас мы запишем макрос,
код которого исследуем и используем
для создания процедуры, строящей сводные
таблицы.
Прежде всего создайте таблицу данных,
похожую на представленную на рис. 19.1.
Пусть эта таблица имеет заголовки Год,
Район, Категория товара и Объем
продаж.
Если вы хотите, чтобы таблица данных на
рабочем листе воспринималась Excel как
список, позаботьтесь о том, чтобы
заголовки столбцов были выделены
шрифтом, отличным оттого, каким набраны
строки сданными.
Выделите таблицу данных и начните запись
макроса. Выполните команду Данные >
Сводная таблица. В первом диалоговом
окне мастера сводных таблиц установите
переключатели в списке или базе данных
Microsoft Excel и сводная таблица. Щелкните
на кнопке Далее. В следующем диалоговом
окне удостоверьтесь, что выбран весь
диапазон таблицы данных, и щелкните на
кнопке Далее. В третьем диалоговом
окне мастера сводных таблиц установите
переключатель новый лист и щелкните на
кнопке Готово. В рабочую книгу будет
добавлен новый лист, содержащий пустую
сводную таблицу (рис. 19.5).
Рис. 19.5. После завершения работы мастера
сводных таблиц на новом рабочем листе
отобразится пустой макет сводной таблицы
Рис. 19.6. Законченная сводная таблица
Перетащите из панели Сводные таблицы
поле Год в область сводной таблицы,
помеченную словами Перетащите сюда
поля страниц. Перетащите поле Район
в область, помеченную словами Перетащите
сюда поля строк. Далее перетащите в
область столбцов сводной таблицы поле
Категория товара, а в область данных
— поле Объем продаж. Законченная
сводная таблица показана на рис. 19.6.
Остановите запись макроса.
Прежде чем исследовать код макроса,
поэкспериментируйте со сводной таблицей.
В поле списка рядом с полем Год
щелкните на кнопке со стрелкой,
направленной вниз, в открывшемся списке
выберите 1997 и щелкните на кнопке
ОК. В сводной таблице отобразится
информация, относящаяся только к 1997
году. Щелкните в поле Категория товара
на кнопке со стрелкой, направленной
вниз, и снимите флажки Бытовая
электротехника и Средства
автоматизации. Щелкните на кнопке
ОК, теперь в сводной таблице будут
представлены только данные по средствам
связи. Проделав описанные операции в
обратном порядке, восстановите
первоначальный вид сводной таблицы.
Исследование кода макроса
Перейдите в редактор Visual Basic и в окне
проектов найдите текущую книгу. Откройте
папку Modules и затем Module1 — вы увидите
код макроса в виде процедуры
МояСводнаяТаблица (если такое имя
вы дали своему макросу). Полный код этой
процедуры приведен в листинге 19.1.
Листинг 19.1. Процедура МояСводнаяТаблица
l:Sub
МояСводнаяТаблица()
2:
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDataBase, _
3:
SourceData:= «Лист1!R1C1:R37C4»).CreatePivotTable
_
TableDestination:=»»,
TableName:»= «СводнаяТаблица1»
4:
ActiveSheet.PivotTableWizard _
5:
TableDestination:=ActiveSheet.Cells(3,1)
6:
ActiveSheet.Cells(3,1).Select
7:
ActiveSheet.PivotTables(«СводнаяТаблица1»).SmallGrid
= False
8:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_
PivotFields(«Год»)
9:
.Orientation = xlPageField
10:
.Position = 1
11:
End With
12:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_
PivotFields(«Район»)
13:
.Orientation = xlRowField
14:
.Position = 1
15:
End With
16:
With ActiveSheet.PivotTables(«СводнаяТаблица1»).
_
PivotFields(«Категория
товара»)
17:
.Orientation = xlColumnField
18:
.Position = 1
19:
End With
20:
With ActiveSheet.PivotTables(«СводнаяТаблица1»].
_
PivotFields(«Объем
продаж»)
21:
.Orientation = xlDataField
22:
.Position = 1
23:
End With
24:End
Sub
Первый оператор в этой процедуре
выполняет метод Add (Добавить)
применительно к коллекции PivotCaches
(Основные кэши). На самом деле в этом
операторе выполняются два метода. В
дополнение к метолу Add, создающему
элемент коллекции PivotCaches, исполняется
еще метод CreatePivotTable (Создать сводную
таблицу), название которого говорит
само за себя:
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDataBase,
SourceData:= _
«Лист1!R1C1:R37C4″).CreatePivotTable
TableDestination:=»», _
TableName:=
«СводнаяТаблица1»
Обратите внимание, что в методе
CreatePivotTable аргумент TableDestination
принимает значение пустой строки — для
Excel это является указанием создать
сводную таблицу на новом рабочем листе.
После создания нового рабочего листа
и сводной таблицы задается ряд свойств:
ActiveSheet.PivotTableWizard
TableDestination:=ActiveSheet. _
Cells(3,
1)
ActiveSheet.Cells(3,1).Select
ActiveSheet.PivotTables(«СводнаяТаблица1»).SmallGrid
= False
Остальные операторы процедуры назначают
областям сводной таблицы соответствующие
поля данных.
With
ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Год»]
.Orientation
= xlPageField
.Position
= 1
End
With
With
ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Район»)
.Orientation
= xlRowField
.Position
= 1
End
With
With
ActiveSheet.PivotTables(«СводнаяТаблица1»).
_
PivotFields(«Категория
товара»)
.Orientation
= xlColumnField
.Position
= 1
End
With
With
ActiveSheet.PivotTables(«СводнаяТаблица1»).
_
PivotFields»Объем
продаж»)
.Orientation
= xlDataField
.Position
= 1
End
With
Если сейчас вы попытаетесь выполнить
макрос еще раз, то получите сообщение
об ошибке, так как сводная таблица с тем
именем, которое указано в аргументе
TableName (Имя таблицы), уже создана.
Чтобы сделать процедуру более гибкой,
внесите в ее код изменения, показанные
в листинге 19.2 (измененные и новые
операторы выделены полужирным шрифтом).
Листинг 19.2. Измененная процедура
МояСводнаяТаблица
1:Sub
МояСводнаяТаблица()
2:
Dim
ptSales As PivotTable
3:
4:
Set
ptSales = ActiveWorkbook.PivotCaches.Add _
(SourceType:=xlDataBase,
SourceData:=
5:
«Лист1!R1C1:R37C4″).CreatePivotTable(TableDestination:=»»)
6:
ActiveSheet.PivotTableWizard _
TableDestination:=ActiveSheet.Cells(3,1)
7:
ActiveSheet.Cells(3,1).Select
8:
ptSales.SmallGrid
= False
9:
With ptSales.PivotFields(«Год»)
10:
.Orientation = xlPageField
11:
.Position = 1
12:
End With
13:
With ptSales.PivotFields(«Район»)
14:
.Orientation = xlRowField
15:
.Position = 1
16:
End With
17:
With ptSales.PivotFields(«Категория
товара»)
13:
.Orientation = xlColumnField
19:
.Position = 1
20:
End With
21:
With ptSales.PivotFields(«Объем
продаж»)
22:
.Orientation = xlDataField
23:
.Position = 1
24:
End With
25:End
Sub
Теперь можно не беспокоиться об имени
создаваемой сводной таблицы. Процедура
будет выполняться столько раз, сколько
необходимо.
Резюме
В этом часе вы познакомились со сводными
таблицами, предназначенными для работы
с большими массивами данных. Продолжая
изучение языка VBA, мы сначала записали
макрос, создающий сводные таблицы, а
затем модифицировали его код.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
sinks Пользователь Сообщений: 65 |
#1 14.09.2018 01:54:19 Добрый день.
Прикрепленные файлы
Изменено: sinks — 18.09.2018 02:49:48 |
||
sinks Пользователь Сообщений: 65 |
нет решения вопроса? |
Maruf Пользователь Сообщений: 71 |
#3 18.09.2018 06:45:52
Изменено: Maruf — 18.09.2018 06:46:00 No crime is so great as daring to Excel. (Winston Churchill) |
||
Maruf Пользователь Сообщений: 71 |
#4 18.09.2018 06:58:06
Для создания сводной определять название книги/файла не требуется. В строке №10 вместо:
можно прописать:
либо перебирать существующие листы с помощью цикла. No crime is so great as daring to Excel. (Winston Churchill) |
||||||
sinks Пользователь Сообщений: 65 |
Maruf, Большое спасибо!!! это то, что нужно)) |
Maruf Пользователь Сообщений: 71 |
Рад помочь. No crime is so great as daring to Excel. (Winston Churchill) |
sinks Пользователь Сообщений: 65 |
Ребят, еще вопрос, косаемый сводной таблицы: |
Maruf Пользователь Сообщений: 71 |
#8 19.09.2018 06:17:35 Может так:
No crime is so great as daring to Excel. (Winston Churchill) |
||
sinks Пользователь Сообщений: 65 |
Maruf, да, спасибо. |
Maruf Пользователь Сообщений: 71 |
#10 19.09.2018 07:58:55
No crime is so great as daring to Excel. (Winston Churchill) |
||
sinks Пользователь Сообщений: 65 |
Maruf, примного благодарен) |
planetaexcel26 Пользователь Сообщений: 647 |
#12 19.12.2018 10:57:34 Maruf
большое спасибо!!! Воспользовался вашим кодом макроса для создания сводной таблицы с динамическим диапазоном. Очень помогло, облазил весь интернет !!! |
Шаги, которые нужно выполнить для создания сводной таблицы, требуют приложения некоторых усилий, и эти усилия зачастую являются излишними. Написав немного кода VBA, вы сможете автоматически создавать простые сводные таблицы.
Сводные таблицы — это весьма разумная и эффективная возможность, которую можно применять к данным, хранящимся в списке или таблице. К сожалению, простой мысли о процессе создания сводной таблицы достаточно, чтобы пользователи отказались от идеи экспериментировать с ними. Хотя некоторые настройки сводных таблиц могут быть достаточно сложными, большую часть сводных таблиц можно создавать легко и просто. Два чаще всего задаваемых вопроса об Excel относятся к тому, как подсчитать количество всех элементов в списке и как создать список уникальных элементов на основе списка, содержащего много повторяющихся элементов. В этой статье мы продемонстрируем, как быстро и просто создать сводную таблицу, которая будет выполнять эти задачи.
Предположим, в столбце А есть длинный список имен, причем в ячейке А1 находится заголовок. Вы хотите узнать, сколько элементов содержится в списке, и создать список уникальных элементов. Выделите ячейку А1 (заголовок) и выберите команду Данные → Сводная таблица (Data → PivotTable and PivotChart Report) (или Data → PivotTable Report на Mac), чтобы запустить мастер сводных таблиц.
Удостоверьтесь, что установлен переключатель В списке или базе данных Microsoft Excel (Microsoft Excel List or Database) и что выделена одна ячейка данных. Это позволит Excel автоматически распознать данные, на основе которых будет далее строиться сводная таблица. Если вы работаете в windows microsoft, то в группе Вид создаваемого отчета (What kind of report do you want to create?) выберите Сводная таблица (PivotTable) (на Macintosh этот вопрос не выводится). Щелкните кнопку Далее (Next). Мастер сводных таблиц должен автоматически выбрать правильный диапазон данных в столбце А и выделить его на листе. Если это так, щелкните кнопку Далее (Next). Иначе выделите диапазон мышью. Щелкните кнопку Макет (Layout) и перетащите в область Данные (Data) то, что будет вашим единственным полем, — над этой областью вы должны увидеть заголовок из ячейки А1. Еще раз перетащите поле с заголовком, на этот раз в область Строка (Row). Щелкните на кнопке ОК.
[stextbox id=»info»]На данном этапе, если необходимо, можно дважды щелкнуть кнопку поля в области Данные (Data) и изменить значение параметра Операция (Summarize by). Можно выбрать Сумма (Sum), Среднее (Average) и т. д. По умолчанию Excel выбирает функцию СЧЁТ (COUNT), если работа идет с текстом, и функцию СУММ (SUM), если это числа.[/stextbox]
Теперь в качестве местоположения отчета сводной таблицы выберите Новый лист (New Worksheet) и щелкните кнопку Готово (Finish). На новом рабочем листе вы должны увидеть сводную таблицу, содержащую уникальные имена из исходного списка и указание, сколько раз каждый элемент (имя) содержится в списке.
А что если вы хотите, чтобы все эти шаги вместо вас выполнял макрос, создавая сводную таблицу на основе любого указанного столбца? Если вы просто запишете макрос, он будет работать, только если данные содержат тот же заголовок. Чтобы избежать этого, можно создать простой макрос, хранящийся в вашей рабочей книге или в личной книге макрокоманд, который будет создавать сводную таблицу по любому списку элементов. Для этого нужно написать некоторый общий код VBA и ввести его в стандартный модуль в вашей личной книге макрокоманд или любой другой книге макрокоманд.
Выберите команду Сервис → Макрос → Редактор Visual Basic (Tools → Macro → Visual Basic Editor) (сочетание клавиш Alt/Option+FH) и затем выберите команду Insert → Module. Введите код, приведенный в листинге 4.1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Листинг 4.1 Sub GetCount() Dim Pt As PivotTable Dim strField As String strField = Selection.Cells(1, 1).Text Range(Selection, Selection.End(xlDown)).Name = "Items" ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, _ SourceData:="=Items").CreatePivotTable TableDestination:="", _ TableName:="ItemList" Set Pt = ActiveSheet.PivotTables("ItemList") ActiveSheet.PivotTableWizard TableDestination:=Cells(3, 1) Pt.AddFields RowFields:=strField Pt.PivotFields(strField).Orientation = xlDataField End Sub |
Чтобы вернуться в Excel, закройте окно Script или нажмите сочетание клавиш Alt/Apple+Q и сохраните рабочую книгу. Перед запуском этого кода выделите заголовок списка и удостоверьтесь, что список не содержит пустых ячеек.
[stextbox id=»warning»]Чтобы быстро удалить пустые ячейки, можно отсортировать список. (PivotTable Field) и Макет (PivotTable Layout)[/stextbox]
Код автоматически создаст именованный диапазон на основе вашего списка и присвоит ему имя Items. Затем он создаст на новом листе сводную таблицу, основываясь на данном именованном диапазоне. В следующий раз, когда у вас появится длинный список данных, вы сможете просто выделить его заголовок и запустить этот макрос. Вся работа по настройке сводной таблицы будет выполнена в мгновение ока.