Макрос excel фильтр в сводной

Содержание

  1. Написание макросов для фильтров
  2. Именованный диапазон для условий
  3. Макро-рекордер — твой друг (или враг)
  4. Как сделать фильтр в сводной таблице макросом
  5. Решение № 1: Макрос VBA для фильтрации сводной таблицы по определенной дате или периоду
  6. Как работает макрос?
  7. Как насчет фильтрации двух сводных таблиц за разные периоды времени?
  8. Настройка: данные конвейера продаж CRM
  9. Как установить номер поля динамически
  10. Добавляем макрос фильтрации
  11. Метод автофильтрации

Написание макросов для фильтров

Фильтры являются отличным инструментом для анализа данных в Excel. Для большинства аналитиков и частых пользователей Excel фильтры являются частью нашей повседневной жизни. Мы используем раскрывающиеся меню фильтров для применения фильтров к отдельным столбцам в наборе данных. Это помогает нам связывать цифры с отчетами и проводить исследование наших данных.

Фильтрация также может быть трудоемким процессом. Особенно, когда мы применяем фильтры к нескольким столбцам на больших листах или фильтруем данные, чтобы затем копировать / вставлять их в другие листы или книги.

В этой статье объясняется, как создавать макросы для автоматизации процесса фильтрации. Это обширное руководство по методу автофильтра в VBA.

У меня также есть статьи с примерами для различных фильтров и типов данных, в том числе: пробелы, текст, числа, даты, цвета и значки, и очищающие фильтры.

Именованный диапазон для условий

Сначала надо создать именованный диапазон, куда мы будем вводить условия, и откуда макрос их будет брать. Для этого можно прямо над таблицей вставить пару-тройку пустых строк, затем выделить ячейки для будущих критериев (на рисунке это A2:F2) и дать им имя Условия, вписав его в поле имени в левом верхнем углу и нажав клавишу Enter. Для наглядности, я выделил эти ячейки желтым цветом:

Макро-рекордер — твой друг (или враг)

Мы можем легко получить код VBA для фильтров, включив макро-рекордер, а затем применив один или несколько фильтров к диапазону / таблице.

Вот шаги для создания макроса фильтра с помощью устройства записи макросов:

  1. Включите рекордер макросов:
    1. Вкладка «Разработчик»> «Запись макроса».
    2. Дайте макросу имя, выберите, где вы хотите сохранить код, и нажмите ОК.
  2. Примените один или несколько фильтров, используя раскрывающиеся меню фильтров.
  3. Остановите рекордер.
  4. Откройте редактор VB (вкладка «Разработчик»> Visual Basic) для просмотра кода.

Если вы уже использовали макрос-рекордер для этого процесса, то вы знаете, насколько он может быть полезен. Тем более, что наши критерии фильтрации становятся более сложными.

Код будет выглядеть примерно так:

 Sub Filters_Macro_Recorder() ' ' Filters_Macro_Recorder Macro ' ' ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4, Criteria1:= _ "Product 2" ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=4 ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=5, Criteria1:= _ ">=500", Operator:=xlAnd, Criteria2:="<=1000" End Sub 

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Мы видим, что каждая строка использует метод AutoFilter для применения фильтра к столбцу. Он также содержит информацию о критериях фильтра.

Как сделать фильтр в сводной таблице макросом

Чтобы получить данные для одного из 4-х магазинов фирмы, достаточно лишь открыть выпадающий список со всеми магазинами и выбрать один из них. Пример результата этих действий изображено на рисунке:

Изменение настроек, которые доступны в интерактивных инструментах сводной таблице доступны так же на уровне программирования макросов из редактора VBA. Выбор магазина, который является элементом поля СТРАИЦЫ реализуется с помощью свойства CurrentPage.

Просто как параметр для этого свойства следует указать название поля. Например, напишем простой код макроса, который сам выберет «Магазин3» как критерий для фильтрования данных по оборотам в сводной таблице:

SubMagazin3()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Магазины").CurrentPage ="Магазин 3"
End Sub

Чтобы создать такой макрос сначала откройте редактор VisualBasic (ALT+F11), а потом создайте новый модуль в редакторе: «Insert»-«Module» и введете в него выше указанный VBA-код:

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

В методе PivotTables указан аргумент «ТаблицаМ» – это всего лишь ссылка на внутренне имя, которое было присвоено для сводной таблицы еще на этапе ее создания. Читайте пример создания где он детально описан: Макрос для создания сводной таблицы в Excel. Далее рассмотрим, как можно скрывать часть данных из области видимости значений.

Решение № 1: Макрос VBA для фильтрации сводной таблицы по определенной дате или периоду

Мы можем использовать простой макрос, чтобы установить фильтр в сводной таблице для самой последней даты в таблице исходных данных. Фильтрация поля «Дата отчета» в сводной таблице также выберет отфильтрованный элемент в срезе и отфильтрует все связанные сводные диаграммы.

Приведенный ниже макрос может выглядеть как много кода, но на самом деле он очень прост. Чтобы его использовать, вам просто нужно будет указать все переменные для имени рабочего листа, имени сводной таблицы, имени сводного поля (Дата отчета) и критериев фильтрации (последняя дата). Эти переменные будут представлять имена объектов в вашей собственной книге.

 Sub Filter_PivotField() ' Описание: фильтрация сводной таблицы или среза по определенной дате или периоду. Dim sSheetName As String Dim sPivotName As String Dim sFieldName As String Dim sFilterCrit As String Dim pi As PivotItem ' Установите переменные sSheetName = "Pivot" sPivotName = "PivotTable1" sFieldName = "Report Date" 'sFilterCrit = "5/2/2016" sFilterCrit = ThisWorkbook.Worksheets("Data").Range("G2").Value With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName) ' Очистить все фильтры основного поля .ClearAllFilters ' Проходить по элементам сводки поля сводки ' Скрыть или отфильтровать элементы, которые не соответствуют критериям For Each pi In .PivotItems If pi.Name <> sFilterCrit Then pi.Visible = False End If Next pi End With End Sub 

Макрос в настоящее время настроен на использование значения из ячейки G2 в Таблице данных для критериев фильтра (самая поздняя дата). Ячейка G2 содержит формулу, которая возвращает самую последнюю дату из столбца с помощью функции MAX

Конечно, это можно изменить, чтобы вычислить самую последнюю дату в коде макроса. Хотя приятно видеть это на листе.

Как работает макрос?

Макрос сначала очищает все фильтры для поля сводки фильтра отчетов с помощью метода ClearAllFilters.

Затем он использует цикл For Next для циклического прохождения всех элементов сводки в поле сводки, чтобы применить фильтр. Каждый уникальный элемент в поле является основным элементом. Макрос проверяет, не соответствует ли имя элемента сводки (<>) критериям. Если нет, то он скрывает элемент или фильтрует его. В результате мы видим только критерии фильтра.

Как насчет фильтрации двух сводных таблиц за разные периоды времени?

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

 Sub Filter_PivotField_Args( _ sSheetName As String, _ sPivotName As String, _ sFieldName As String, _ sFilterCrit As String) ' Фильтрация сводной таблицы или среза по определенной дате или периоду Dim pi As PivotItem With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName) ' Очистить все фильтры основного поля .ClearAllFilters ' Проходить по элементам сводки поля сводки ' Скрыть или отфильтровать элементы, которые не соответствуют критериям For Each pi In .PivotItems If pi.Name <> sFilterCrit Then pi.Visible = False End If Next pi End With End Sub 
 Sub Filter_Multiple_Pivots() ' Вызвать макрос Filter Pivot для нескольких пивотов Dim sFilter1 As String Dim sFilter2 As String ' Установите критерии фильтра sFilter1 = ThisWorkbook.Worksheets("Data").Range("G2").Value sFilter2 = ThisWorkbook.Worksheets("Data").Range("G3").Value ' Вызовите макрос сводных фильтров, чтобы отфильтровать оба сводных Call Filter_PivotField_Args("2 Pivots", "PivotTable1", "Report Date", sFilter1) Call Filter_PivotField_Args("2 Pivots", "PivotTable2", "Report Date", sFilter2) End Sub 

В этом примере у нас есть лист с двумя сводными таблицами для сравнения неделя за неделей. Таким образом, нам нужно отфильтровать одну сводную таблицу для самой последней даты и одну для даты предыдущей недели.

Макрос Filter_Multiple_Pivots вызывает макрос Filter_PivotField_Args дважды. Обратите внимание, что имя сводной таблицы и значения критериев фильтрации различны для каждого вызова. Это простой способ многократно использовать макрос сводного поля фильтра без необходимости повторения большого количества кода.

Настройка: данные конвейера продаж CRM

В этом примере мы собираемся использовать данные о продажах. Таблица данных содержит еженедельные снимки или экспорт данных из системы CRM (Salesforces.com, Dynamics CRM, HubSpot и т.д.).

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

В наборе данных есть столбец «Дата отчета», в котором содержится дата запуска отчета для каждой строки. Вы можете видеть на изображении, что есть 4 набора данных, добавленных (сложенных) вместе, чтобы создать одну большую таблицу.

Сводная таблица показывает сводку доходов по этапам конвейера, а поле «Дата отчета» находится в области «Фильтры». Это позволяет нам фильтровать по любой дате отчета, чтобы увидеть сводную информацию о конвейере за эту неделю.

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

Как установить номер поля динамически

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

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

 Sub Dynamic_Field_Number() 'Методы, чтобы найти и установить поле на основе имени столбца. Dim lo As ListObject Dim iCol As Long 'Установить ссылку на первую таблицу на листе Set lo = Sheet1.ListObjects(1) 'Установить поле фильтра iCol = lo.ListColumns("Product").Index 'Использовать функцию соответствия для регулярных диапазонов 'iCol = WorksheetFunction.Match("Product", Sheet1.Range("B3:G3"), 0) 'Использовать переменную для значения параметра поля lo.Range.AutoFilter Field:=iCol, Criteria1:="Product 3" End Sub 

Номер столбца будет найден при каждом запуске макроса. Нам не нужно беспокоиться об изменении номера поля при перемещении столбца. Это экономит время и предотвращает ошибки (беспроигрышный вариант)!

Добавляем макрос фильтрации

Теперь надо добавить к текущему листу макрос фильтрации по критериям из созданного диапазона Условия. Для этого щелкните правой кнопкой мыши по ярлычку листа и выберите команду Исходный текст (Source text). В открывшееся окно редактора Visual Basic надо скопировать и вставить текст вот такого макроса:

Private Sub Worksheet_Change(ByVal Target As Range) Dim FilterCol As Integer Dim FilterRange As Range Dim CondtitionString As Variant Dim Condition1 As String, Condition2 As String If Intersect(Target, Range("Условия")) Is Nothing Then Exit Sub On Error Resume Next Application.ScreenUpdating = False 'определяем диапазон данных списка Set FilterRange = Target.Parent.AutoFilter.Range 'считываем условия из всех измененных ячеек диапазона условий For Each cell In Target.Cells FilterCol = cell.Column - FilterRange.Columns(1).Column + 1 If IsEmpty(cell) Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol Else If InStr(1, UCase(cell.Value), " ИЛИ ") > 0 Then LogicOperator = xlOr ConditionArray = Split(UCase(cell.Value), " ИЛИ ") Else If InStr(1, UCase(cell.Value), " И ") > 0 Then LogicOperator = xlAnd ConditionArray = Split(UCase(cell.Value), " И ") Else ConditionArray = Array(cell.Text) End If End If 'формируем первое условие If Left(ConditionArray(0), 1) = "<" Or Left(ConditionArray(0), 1) = ">" Then Condition1 = ConditionArray(0) Else Condition1 = "=" & ConditionArray(0) End If 'формируем второе условие - если оно есть If UBound(ConditionArray) = 1 Then If Left(ConditionArray(1), 1) = "<" Or Left(ConditionArray(1), 1) = ">" Then Condition2 = ConditionArray(1) Else Condition2 = "=" & ConditionArray(1) End If End If 'включаем фильтрацию If UBound(ConditionArray) = 0 Then Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1 Else Target.Parent.Range(FilterRange.Address).AutoFilter Field:=FilterCol, Criteria1:=Condition1, _ Operator:=LogicOperator, Criteria2:=Condition2 End If End If Next cell Set FilterRange = Nothing Application.ScreenUpdating = True End Sub 

Все.

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

Как и в случае с классическими Автофильтром (Filter) и Расширенным фильтром (Advanced Filter), в нашем фильтре макросом можно смело использовать символы подстановки:

  • * (звездочка) – заменяет любое количество любых символов
  • ? (вопросительный знак) – заменяет один любой символ

и операторы логической связки:

  • И – выполнение обоих условий
  • ИЛИ – выполнение хотя бы одного из двух условий

и любые математические символы неравенства (>,<,=,>=,<=,<>).

При удалении содержимого ячеек желтого диапазона Условия автоматически снимается фильтрация с соответствующих столбцов.

Метод автофильтрации

Метод AutoFilter используется для очистки и применения фильтров к одному столбцу в диапазоне или таблице в VBA. Он автоматизирует процесс применения фильтров через выпадающие меню фильтров и делает, чтобы все работало.

Его можно использовать для применения фильтров к нескольким столбцам путем написания нескольких строк кода, по одной для каждого столбца. Мы также можем использовать Автофильтр, чтобы применить несколько критериев фильтрации к одному столбцу, так же, как в выпадающем меню фильтра, установив несколько флажков или указав диапазон дат.

Источники

  • https://excelpedia.ru/makrosi-v-excel/macros-filters-autofilter-method
  • https://www.planetaexcel.ru/techniques/3/137/
  • https://exceltable.com/vba-macros/makrosy-filtra-svodnoy-tablicy
  • https://excelpedia.ru/makrosi-v-excel/filtraciya-svodnoj-tablicy

Используя макросы, можно быстро и автоматически управлять структурой сводных таблиц. В данном примере будут описаны процессы фильтрации и скрытия столбцов значений в сводных отчетах Excel.

Как сделать фильтр в сводной таблице макросом

Чтобы получить данные для одного из 4-х магазинов фирмы, достаточно лишь открыть выпадающий список со всеми магазинами и выбрать один из них. Пример результата этих действий изображено на рисунке:

Тестовая сводная таблица.

Изменение настроек, которые доступны в интерактивных инструментах сводной таблице доступны так же на уровне программирования макросов из редактора VBA. Выбор магазина, который является элементом поля СТРАИЦЫ реализуется с помощью свойства CurrentPage.

Просто как параметр для этого свойства следует указать название поля. Например, напишем простой код макроса, который сам выберет «Магазин3» как критерий для фильтрования данных по оборотам в сводной таблице:

Sub Magazin3()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Магазины").CurrentPage = "Магазин 3"
End Sub

Чтобы создать такой макрос сначала откройте редактор VisualBasic (ALT+F11), а потом создайте новый модуль в редакторе: «Insert»-«Module» и введете в него выше указанный VBA-код:

VisualBasic.

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

В методе PivotTables указан аргумент «ТаблицаМ» – это всего лишь ссылка на внутренне имя, которое было присвоено для сводной таблицы еще на этапе ее создания. Читайте пример создания где он детально описан: Макрос для создания сводной таблицы в Excel. Далее рассмотрим, как можно скрывать часть данных из области видимости значений.



Как скрыть столбец в сводном отчете макросом

Во многих ситуациях необходимо скрытие части данных, чтобы сосредоточить внимание аналитика на конкретно выбранной задачи или поставленной цели. Естественно сводная таблица обладает такой функцией без потери данных, а только лишь их визуальным скрытием. Чтобы скрыть в таблице данные за 2017 год с помощью макроса, введите в модуль следующий код:

Sub Hidden2017()
ActiveSheet.PivotTables("ТаблицаМ").PivotFields("Год").PivotItems("2017").Visible = False
End Sub

Пример VBA-макроса в действии:

Пример VBA-макроса.

Чтобы снова включить (или сделать второй режим для переключателя скрыть/показать) в таблицу данные за 2017 год достаточно лишь в этом коде поменять параметр Fale на True.

Читайте также: Макрос позволяет рассчитать процент в сводной таблице Excel.

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

На чтение 7 мин. Просмотров 6.8k.

Итог: узнаете, как отфильтровать сводную таблицу, сводную диаграмму или установить срез для самой последней даты или периода в наборе данных.

Уровень мастерства: Средний

How to Automatically Filter for the Most Recent Date in a Pivot Table or Slicer

Pip имеет набор отчетов на основе сводных таблиц, которые она часто обновляет (ежедневно, еженедельно, ежемесячно). Она хочет автоматически фильтровать отчеты по самой последней дате в столбце в наборе данных. Этот фильтр выберет элемент в слайсере, чтобы отфильтровать сводные таблицы и диаграммы.

Как и все в Excel, есть несколько способов решить эту
проблему. Мы можем использовать макрос или добавить вычисляемый столбец в набор
данных …

Содержание

  1. Настройка: данные конвейера продаж CRM
  2. Решение № 1: Макрос VBA для фильтрации сводной
    таблицы по определенной дате или периоду
  3. Решение № 2. Добавление вычисляемого столбца в
    набор данных
  4. Два способа автоматизации фильтрации сводных
    таблиц

Настройка: данные конвейера продаж CRM

В этом примере мы собираемся использовать данные о продажах. Таблица данных содержит еженедельные снимки или экспорт данных из системы CRM (Salesforces.com, Dynamics CRM, HubSpot и т.д.).

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

CRM Sales Pipeline Source Data Updated with Weekly Snapshots" width

В наборе данных есть
столбец «Дата отчета», в котором содержится дата запуска отчета для каждой строки.
Вы можете видеть на изображении, что есть 4 набора данных, добавленных
(сложенных) вместе, чтобы создать одну большую таблицу.

Сводная таблица показывает
сводку доходов по этапам конвейера, а поле «Дата отчета» находится в области
«Фильтры». Это позволяет нам фильтровать по любой дате отчета, чтобы увидеть
сводную информацию о конвейере за эту неделю.

Pivot Table for Pipeline Revenue by Stage - Filter for Most Recent Period

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

Решение № 1: Макрос VBA для фильтрации сводной
таблицы по определенной дате или периоду

Мы можем использовать
простой макрос, чтобы установить фильтр в сводной таблице для самой последней
даты в таблице исходных данных. Фильтрация поля «Дата отчета» в сводной таблице
также выберет отфильтрованный элемент в срезе и отфильтрует все связанные
сводные диаграммы.

Приведенный ниже макрос
может выглядеть как много кода, но на самом деле он очень прост. Чтобы его
использовать, вам просто нужно будет указать все переменные для имени рабочего
листа, имени сводной таблицы, имени сводного поля (Дата отчета) и критериев
фильтрации (последняя дата). Эти переменные будут представлять имена объектов в
вашей собственной книге.

Sub Filter_PivotField()
' Описание: фильтрация сводной таблицы или среза по определенной дате или периоду.

Dim sSheetName As String
Dim sPivotName As String
Dim sFieldName As String
Dim sFilterCrit As String
Dim pi As PivotItem

    ' Установите переменные
    sSheetName = "Pivot"
    sPivotName = "PivotTable1"
    sFieldName = "Report Date"
    'sFilterCrit = "5/2/2016"
    sFilterCrit = ThisWorkbook.Worksheets("Data").Range("G2").Value
    
    With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
        ' Очистить все фильтры основного поля
        .ClearAllFilters
        
        ' Проходить по элементам сводки поля сводки
        ' Скрыть или отфильтровать элементы, которые не соответствуют критериям
        For Each pi In .PivotItems
            If pi.Name <> sFilterCrit Then
                pi.Visible = False
            End If
        Next pi
        
    End With

End Sub

Макрос в настоящее время
настроен на использование значения из ячейки G2 в Таблице данных для критериев
фильтра (самая поздняя дата). Ячейка G2 содержит формулу, которая возвращает
самую последнюю дату из столбца с помощью функции MAX

Calculate the Latest Date in the Column with the MAX Function

Конечно, это можно
изменить, чтобы вычислить самую последнюю дату в коде макроса. Хотя приятно
видеть это на листе.

Как работает макрос?

Макрос сначала очищает все
фильтры для поля сводки фильтра отчетов с помощью метода ClearAllFilters.

Затем он использует цикл
For Next для циклического прохождения всех элементов сводки в поле сводки,
чтобы применить фильтр. Каждый уникальный элемент в поле является основным
элементом. Макрос проверяет, не соответствует ли имя элемента сводки (<>)
критериям. Если нет, то он скрывает элемент или фильтрует его. В результате мы
видим только критерии фильтра.

У меня есть статья, которая объясняет For Next Loops более подробно.

Pivot Items in the Filter Drop-down Menu of a Pivot Table

Как насчет фильтрации двух сводных таблиц за
разные периоды времени?

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

Sub Filter_PivotField_Args( _
    sSheetName As String, _
    sPivotName As String, _
    sFieldName As String, _
    sFilterCrit As String)
' Фильтрация сводной таблицы или среза по определенной дате или периоду
Dim pi As PivotItem
    
    With ThisWorkbook.Worksheets(sSheetName).PivotTables(sPivotName).PivotFields(sFieldName)
        ' Очистить все фильтры основного поля
        .ClearAllFilters
        
        ' Проходить по элементам сводки поля сводки
        ' Скрыть или отфильтровать элементы, которые не соответствуют критериям
        For Each pi In .PivotItems
            If pi.Name <> sFilterCrit Then
                pi.Visible = False
            End If
        Next pi
    End With

End Sub

Sub Filter_Multiple_Pivots()
' Вызвать макрос Filter Pivot для нескольких пивотов
Dim sFilter1 As String
Dim sFilter2 As String

    ' Установите критерии фильтра
    sFilter1 = ThisWorkbook.Worksheets("Data").Range("G2").Value
    sFilter2 = ThisWorkbook.Worksheets("Data").Range("G3").Value

    ' Вызовите макрос сводных фильтров, чтобы отфильтровать оба сводных
    Call Filter_PivotField_Args("2 Pivots", "PivotTable1", "Report Date", sFilter1)
    Call Filter_PivotField_Args("2 Pivots", "PivotTable2", "Report Date", sFilter2)

End Sub

В этом примере у нас есть лист с двумя сводными таблицами для сравнения неделя за неделей. Таким образом, нам нужно отфильтровать одну сводную таблицу для самой последней даты и одну для даты предыдущей недели.

Макрос Filter_Multiple_Pivots вызывает макрос Filter_PivotField_Args дважды. Обратите внимание, что имя сводной таблицы и значения критериев фильтрации различны для каждого вызова. Это простой способ многократно использовать макрос сводного поля фильтра без необходимости повторения большого количества кода.

Ознакомьтесь с моей бесплатной серией видео о том, как начать работу с макросами и VBA, чтобы узнать больше о написании макросов.

Решение № 2. Добавление вычисляемого столбца в
набор данных

Если вы не можете использовать макросы, вы можете решить эту проблему с помощью вычисляемого столбца. Это решение НЕ так гибко, как макрос. Оно НЕ очень хорошо работает, если вы хотите иметь срезы, где пользователь может выбирать другие даты отчета.

Мы можем добавить столбец
к исходным данным, чтобы проверить, совпадает ли дата отчета в каждой строке с
самой последней датой. Мы назовем этот столбец «Current Wk».

Add a Calculated Column to the Source Data to Determine the Current Period

Если это так, то формула
вернет ИСТИНА, если нет — ЛОЖЬ.

Это очень простая формула.
Мы могли бы использовать функцию If, но в этом нет необходимости. Знак
равенства оценивает совпадение и возвращает значение ИСТИНА или ЛОЖЬ.
Ознакомьтесь с моей статьей If в
формулах Excel для объяснения этого.

Теперь мы можем добавить
этот новый столбец в область «Фильтры» сводной таблицы и отфильтровать его для
ИСТИНА. Это означает, что каждый раз, когда исходные данные обновляются новыми
данными, формулы пересчитывают новые строки текущей недели. Обновление сводной
таблицы автоматически применит фильтр для строк текущей недели и отобразит их в
сводной таблице.

Add the Current Week Field to Filters Area and Filter for TRUE

Недостатком здесь является
то, что пользователь не может использовать слайсер для фильтрации других дат.
Технически они могут, но нам придется повторно применить фильтр Current Wk при
следующем обновлении данных. Мы могли бы использовать макрос для автоматизации
этого, но тогда мы действительно вернулись к решению № 1.

Хотя он не такой
динамичный, как решение № 1, рассчитанный столбец может быть всем необходимым
для отображения данных за последний период в статическом отчете.

Два способа автоматизации фильтрации сводных
таблиц

Фильтрация сводных таблиц
по самой последней дате или периоду — это, безусловно, хороший процесс для
автоматизации, если вы часто выполняете эту задачу. Это может сэкономить нам
много времени и предотвратить ошибки, которые обычно возникают при этих скучных
повторяющихся задачах. 🙂

Пожалуйста, оставьте
комментарий ниже с любыми вопросами или предложениями. Спасибо!


You can use the following methods to filter pivot tables in Excel using VBA:

Method 1: Filter Pivot Table Based on One Value

Sub FilterPivotTable()
   Dim pf As PivotField
   Dim myFilter As String
   Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Position")
   myFilter = ActiveWorkbook.Sheets("Sheet1").Range("J2").Value
   pf.PivotFilters.Add2 xlCaptionEquals, , myFilter
End Sub

This particular macro will filter the pivot table called PivotTable1 to only display rows where the value in the Position column of the pivot table is equal to the value in cell J2 of Sheet1.

Method 2: Filter Pivot Table Based on Multiple Values

Sub FilterPivotTableMultiple()
  Dim v As Variant
  Dim i As Integer, j As Integer
  Dim pf As PivotField
  Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Position")
  
  'specify range with values to filter on
  v = Range("J2:J3")
  
  'clear existing filters
  pf.ClearAllFilters
  
  'apply filter to pivot table
  With pf
    For i = 1 To pf.PivotItems.Count
      j = 1
       Do While j <= UBound(v, 1) - LBound(v, 1) + 1
         If pf.PivotItems(i).Name = v(j, 1) Then
           pf.PivotItems(pf.PivotItems(i).Name).Visible = True
           Exit Do
        Else
          pf.PivotItems(pf.PivotItems(i).Name).Visible = False
        End If
        j = j + 1
      Loop
    Next i
  End With
End Sub

This particular macro will filter the pivot table called PivotTable1 to only display rows where the value in the Position column of the pivot table is equal to one of the values in the cell range J2:J3.

Method 3: Clear Filters from Pivot Table

Sub ClearPivotTableFilter()
   Dim pt As PivotTable
   Set pt = ActiveSheet.PivotTables("PivotTable1")
   pt.ClearAllFilters
End Sub

This particular macro will clear all filters from the pivot table called PivotTable1.

The following examples show how to use each of these methods in practice.

Example 1: Filter Pivot Table Based on One Value

Suppose we have created a pivot table from a dataset in Excel to summarize the points scored by basketball players on various teams and positions:

Suppose we would like to filter the pivot table to only show the rows where the value in the Position column is Guard.

We can create the following macro to do so:

Sub FilterPivotTable()
   Dim pf As PivotField
   Dim myFilter As String
   Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Position")
   myFilter = ActiveWorkbook.Sheets("Sheet1").Range("J2").Value
   pf.PivotFilters.Add2 xlCaptionEquals, , myFilter
End Sub

When we run this macro, the pivot table is automatically filtered to only show rows where the value in the Position column is Guard:

VBA filter pivot table

The pivot table has been filtered to only show rows where the value in the Position column is Guard.

Example 2: Filter Pivot Table Based on Multiple Values

Suppose we would instead like to filter the pivot table to only show rows where the value in the Position column is Guard or Center.

We can create the following macro to do so:

Sub FilterPivotTableMultiple()
  Dim v As Variant
  Dim i As Integer, j As Integer
  Dim pf As PivotField
  Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("Position")
  
  'specify range with values to filter on
  v = Range("J2:J3")
  
  'clear existing filters
  pf.ClearAllFilters
  
  'apply filter to pivot table
  With pf
    For i = 1 To pf.PivotItems.Count
      j = 1
       Do While j <= UBound(v, 1) - LBound(v, 1) + 1
         If pf.PivotItems(i).Name = v(j, 1) Then
           pf.PivotItems(pf.PivotItems(i).Name).Visible = True
           Exit Do
        Else
          pf.PivotItems(pf.PivotItems(i).Name).Visible = False
        End If
        j = j + 1
      Loop
    Next i
  End With
End Sub

When we run this macro, the pivot table is automatically filtered to only show rows where the value in the Position column is Guard or Center:

VBA filter pivot table based on multiple values

The pivot table has been filtered to only show rows where the value in the Position column is Guard or Center.

Additional Resources

The following tutorials explain how to perform other common tasks in VBA:

VBA: How to Refresh Pivot Tables
VBA: How to Remove Duplicate Values
VBA: How to Count Number of Rows in Range

Фильтр исходных данных в сводной таблице

У любого уважающего себя тренера всегда есть запас «вау-фишек» — простых, но эффектных приемов, эдаких killing-features для быстрого очарования сложной аудитории. В сводных таблицах одной из таких фишек, безусловно, является двойной щелчок левой кнопкой мыши по любому числу в области значений:

filter-pivot1.png

Если это сделать, то вас вынесет на новый лист, куда Excel выгрузит детализацию по данной ячейке — всю «подноготную», объясняющую как получилось данное значение, из чего оно сложилось:

filter-pivot2.png

Официально, эта процедура называется drill-down, неофициально ее обычно называют «провалиться».

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

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

Стандартными средствами такое невозможно, но для макросов пределы возможного в Excel существенно шире :)

Откройте редактор Visual Basic:

  • В Excel 2003 и старше для этого нужно выбрать в меню Сервис — Макрос — Редактор Visual Basic (Tools — Macro — Visual Basic Editor)
  • В новых версиях Excel 2007-2013 перейти на вкладку Разработчик (Developer) и нажать кнопку Visual Basic. Если такой вкладки у вас не видно, то включите ее в настройках Файл — Параметры — Настройка ленты (File — Options — Customize Ribbon)

В окне редактора вставьте новый модуль через меню Insert — Module и скопируйте туда текст вот этих двух макросов:

Sub FilterPivot()
    Dim pt As PivotTable
    
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False

    Set pt = ActiveCell.PivotTable
    Set rSource = Application.Evaluate(Application.ConvertFormula(pt.SourceData, xlR1C1, xlA1))
    rSource.EntireRow.Hidden = False
    nCols = rSource.Columns.Count
    Selection.ShowDetail = True
    Set rDrill = ActiveSheet.UsedRange
    Set shDrill = ActiveSheet
    DrillLastRow = shDrill.Range("A1").End(xlDown).Row
    For i = nCols To 1 Step -1
        formulatxt = formulatxt & "RC[-" & i & "]&"
    Next i
    formulatxt = Left(formulatxt, Len(formulatxt) - 1)
    shDrill.Cells(2, nCols + 1).Resize(DrillLastRow - 1, 1).FormulaR1C1 = "=" & formulatxt

    For j = 2 To rSource.Rows.Count
        contxt = ""
        For i = 1 To nCols
            contxt = contxt & rSource.Cells(j, i).Value
        Next i
        If WorksheetFunction.CountIf(shDrill.Cells(2, nCols + 1).Resize(DrillLastRow - 1, 1), contxt) = 0 Then
            rSource.Cells(j, 1).EntireRow.Hidden = True
        End If
    Next j

    shDrill.Delete
    rSource.Parent.Activate

    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Sub ShowAllData()
    ActiveSheet.Rows.Hidden = False
End Sub

Теперь, если выделить одну любую ячейку с данными в сводной таблице и запустить наш первый макрос FilterPivot с помощью сочетания клавиш Alt+F8 или через меню Сервис — Макрос — Макросы (Tools — Macro — Macros), то мы перейдем на лист с исходными данными для сводной, где автоматически будут применены фильтры, отбирающие только те строки, которые участвовали в расчете текущей ячейки:

filter-pivot3.png

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

Второй макрос ShowAllData нужен, чтобы вернуть прежний вид исходной таблицы — он делает все строки на текущем листе видимыми. Для пущего удобства можно повесить эти два макроса на удобные вам сочетания клавиш, используя кнопку Параметры (Options) в окне Макросы, которое отображается по Alt+F8.

Ссылки по теме

  • Что такое сводные таблицы, как их строить
  • Настройка вычислений в сводных таблицах
  • Новые возможности сводных таблиц в Microsoft Excel 2013

Понравилась статья? Поделить с друзьями:
  • Макрос excel ускорить работу макроса
  • Макрос excel удаление скрытых строк
  • Макрос excel удаление пустой строки
  • Макрос excel удаление папок
  • Макрос excel типы данных