Excel перебор по фильтру

Содержание

  • Выполнение выборки
    • Способ 1: применение расширенного автофильтра
    • Способ 2: применение формулы массива
    • Способ 3: выборка по нескольким условиям с помощью формулы
    • Способ 4: случайная выборка
  • Вопросы и ответы

Выборка в Microsoft Excel

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

Выполнение выборки

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

Способ 1: применение расширенного автофильтра

Наиболее простым способом произвести отбор является применение расширенного автофильтра. Рассмотрим, как это сделать на конкретном примере.

  1. Выделяем область на листе, среди данных которой нужно произвести выборку. Во вкладке «Главная» щелкаем по кнопке «Сортировка и фильтр». Она размещается в блоке настроек «Редактирование». В открывшемся после этого списка выполняем щелчок по кнопке «Фильтр».
    Включение фильтра в Microsoft Excel

    Есть возможность поступить и по-другому. Для этого после выделения области на листе перемещаемся во вкладку «Данные». Щелкаем по кнопке «Фильтр», которая размещена на ленте в группе «Сортировка и фильтр».

  2. Включение фильтра через вкладку Данные в Microsoft Excel

  3. После этого действия в шапке таблицы появляются пиктограммы для запуска фильтрования в виде перевернутых острием вниз небольших треугольников на правом краю ячеек. Кликаем по данному значку в заглавии того столбца, по которому желаем произвести выборку. В запустившемся меню переходим по пункту «Текстовые фильтры». Далее выбираем позицию «Настраиваемый фильтр…».
  4. Переход в настраиваемый фильтр в Microsoft Excel

  5. Активируется окно пользовательской фильтрации. В нем можно задать ограничение, по которому будет производиться отбор. В выпадающем списке для столбца содержащего ячейки числового формата, который мы используем для примера, можно выбрать одно из пяти видов условий:
    • равно;
    • не равно;
    • больше;
    • больше или равно;
    • меньше.

    Давайте в качестве примера зададим условие так, чтобы отобрать только значения, по которым сумма выручки превышает 10000 рублей. Устанавливаем переключатель в позицию «Больше». В правое поле вписываем значение «10000». Чтобы произвести выполнение действия, щелкаем по кнопке «OK».

  6. Пользвательский фильтр в Microsoft Excel

  7. Как видим, после фильтрации остались только строчки, в которых сумма выручки превышает 10000 рублей.
  8. Результаты фильтрации в Microsoft Excel

  9. Но в этом же столбце мы можем добавить и второе условие. Для этого опять возвращаемся в окно пользовательской фильтрации. Как видим, в его нижней части есть ещё один переключатель условия и соответствующее ему поле для ввода. Давайте установим теперь верхнюю границу отбора в 15000 рублей. Для этого выставляем переключатель в позицию «Меньше», а в поле справа вписываем значение «15000».

    Кроме того, существует ещё переключатель условий. У него два положения «И» и «ИЛИ». По умолчанию он установлен в первом положении. Это означает, что в выборке останутся только строчки, которые удовлетворяют обоим ограничениям. Если он будет выставлен в положение «ИЛИ», то тогда останутся значения, которые подходят под любое из двух условий. В нашем случае нужно выставить переключатель в положение «И», то есть, оставить данную настройку по умолчанию. После того, как все значения введены, щелкаем по кнопке «OK».

  10. Установка верхней границы в пользовательском фильтре в Microsoft Excel

  11. Теперь в таблице остались только строчки, в которых сумма выручки не меньше 10000 рублей, но не превышает 15000 рублей.
  12. Результаты фильтрации по нижней и верхней границе в Microsoft Excel

  13. Аналогично можно настраивать фильтры и в других столбцах. При этом имеется возможность сохранять также фильтрацию и по предыдущим условиям, которые были заданы в колонках. Итак, посмотрим, как производится отбор с помощью фильтра для ячеек в формате даты. Кликаем по значку фильтрации в соответствующем столбце. Последовательно кликаем по пунктам списка «Фильтр по дате» и «Настраиваемый фильтр».
  14. Переход к фильтрации по дате в Microsoft Excel

  15. Снова запускается окно пользовательского автофильтра. Выполним отбор результатов в таблице с 4 по 6 мая 2016 года включительно. В переключателе выбора условий, как видим, ещё больше вариантов, чем для числового формата. Выбираем позицию «После или равно». В поле справа устанавливаем значение «04.05.2016». В нижнем блоке устанавливаем переключатель в позицию «До или равно». В правом поле вписываем значение «06.05.2016». Переключатель совместимости условий оставляем в положении по умолчанию – «И». Для того, чтобы применить фильтрацию в действии, жмем на кнопку «OK».
  16. Пользвательский фильтр для формата даты в Microsoft Excel

  17. Как видим, наш список ещё больше сократился. Теперь в нем оставлены только строчки, в которых сумма выручки варьируется от 10000 до 15000 рублей за период с 04.05 по 06.05.2016 включительно.
  18. Результаты фильтрации по сумме и дате в Microsoft Excel

  19. Мы можем сбросить фильтрацию в одном из столбцов. Сделаем это для значений выручки. Кликаем по значку автофильтра в соответствующем столбце. В выпадающем списке щелкаем по пункту «Удалить фильтр».
  20. Удаление фильтра с одного из столбцов в Microsoft Excel

    Lumpics.ru

  21. Как видим, после этих действий, выборка по сумме выручки будет отключена, а останется только отбор по датам (с 04.05.2016 по 06.05.2016).
  22. Ограничения только по дате в Microsoft Excel

  23. В данной таблице имеется ещё одна колонка – «Наименование». В ней содержатся данные в текстовом формате. Посмотрим, как сформировать выборку с помощью фильтрации по этим значениям.

    Кликаем по значку фильтра в наименовании столбца. Последовательно переходим по наименованиям списка «Текстовые фильтры» и «Настраиваемый фильтр…».

  24. Переход к текстовой фильтрации в Microsoft Excel

  25. Опять открывается окно пользовательского автофильтра. Давайте сделаем выборку по наименованиям «Картофель» и «Мясо». В первом блоке переключатель условий устанавливаем в позицию «Равно». В поле справа от него вписываем слово «Картофель». Переключатель нижнего блока так же ставим в позицию «Равно». В поле напротив него делаем запись – «Мясо». И вот далее мы выполняем то, чего ранее не делали: устанавливаем переключатель совместимости условий в позицию «ИЛИ». Теперь строчка, содержащая любое из указанных условий, будет выводиться на экран. Щелкаем по кнопке «OK».
  26. Пользвательский фильтр для формата текста в Microsoft Excel

  27. Как видим, в новой выборке существуют ограничения по дате (с 04.05.2016 по 06.05.2016) и по наименованию (картофель и мясо). По сумме выручки ограничений нет.
  28. Ограничения по дате и по наименованию в Microsoft Excel

  29. Полностью удалить фильтр можно теми же способами, которые использовались для его установки. Причем неважно, какой именно способ применялся. Для сброса фильтрации, находясь во вкладке «Данные» щелкаем по кнопке «Фильтр», которая размещена в группе «Сортировка и фильтр».
    Очистка фильтра в Microsoft Excel

    Второй вариант предполагает переход во вкладку «Главная». Там выполняем щелчок на ленте по кнопке «Сортировка и фильтр» в блоке «Редактирование». В активировавшемся списке нажимаем на кнопку «Фильтр».

Очистка фильтра во вкладке Главная в Microsoft Excel

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

Фильтр сброшен в Microsoft Excel

Урок: Функция автофильтр в Excel

Способ 2: применение формулы массива

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

  1. На том же листе создаем пустую таблицу с такими же наименованиями столбцов в шапке, что и у исходника.
  2. Создание пустой таблицы в Microsoft Excel

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

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

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

  4. Ввод формулы в Microsoft Excel

  5. Так как это формула массива, то для того, чтобы применить её в действии, нужно нажимать не кнопку Enter, а сочетание клавиш Ctrl+Shift+Enter. Делаем это.
  6. Формула массива введена в столбец наименований в Microsoft Excel

  7. Выделив второй столбец с датами и установив курсор в строку формул, вводим следующее выражение:

    =ИНДЕКС(B2:B29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Жмем сочетание клавиш Ctrl+Shift+Enter.

  8. Формула массива введена в столбец даты в Microsoft Excel

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

    =ИНДЕКС(C2:C29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Опять набираем сочетание клавиш Ctrl+Shift+Enter.

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

  10. Формула массива введена в столбец выручки в Microsoft Excel

  11. Как видим, таблица заполнена данными, но внешний вид её не совсем привлекателен, к тому же, значения даты заполнены в ней некорректно. Нужно исправить эти недостатки. Некорректность даты связана с тем, что формат ячеек соответствующего столбца общий, а нам нужно установить формат даты. Выделяем весь столбец, включая ячейки с ошибками, и кликаем по выделению правой кнопкой мыши. В появившемся списке переходим по пункту «Формат ячейки…».
  12. Переход к форматировани ячеек в Microsoft Excel

  13. В открывшемся окне форматирования открываем вкладку «Число». В блоке «Числовые форматы» выделяем значение «Дата». В правой части окна можно выбрать желаемый тип отображения даты. После того, как настройки выставлены, жмем на кнопку «OK».
  14. Установка формата даты в Microsoft Excel

  15. Теперь дата отображается корректно. Но, как видим, вся нижняя часть таблицы заполнена ячейками, которые содержат ошибочное значение «#ЧИСЛО!». По сути, это те ячейки, данных из выборки для которых не хватило. Более привлекательно было бы, если бы они отображались вообще пустыми. Для этих целей воспользуемся условным форматированием. Выделяем все ячейки таблицы, кроме шапки. Находясь во вкладке «Главная» кликаем по кнопке «Условное форматирование», которая находится в блоке инструментов «Стили». В появившемся списке выбираем пункт «Создать правило…».
  16. Переход к созданию правила в Microsoft Excel

  17. В открывшемся окне выбираем тип правила «Форматировать только ячейки, которые содержат». В первом поле под надписью «Форматировать только ячейки, для которых выполняется следующее условие» выбираем позицию «Ошибки». Далее жмем по кнопке «Формат…».
  18. Переход к выбору формата в Microsoft Excel

  19. В запустившемся окне форматирования переходим во вкладку «Шрифт» и в соответствующем поле выбираем белый цвет. После этих действий щелкаем по кнопке «OK».
  20. Формат ячеек в Microsoft Excel

  21. На кнопку с точно таким же названием жмем после возвращения в окно создания условий.

Создание условия форматирования в Microsoft Excel

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

Выборка сделана в Microsoft Excel

Урок: Условное форматирование в Excel

Способ 3: выборка по нескольким условиям с помощью формулы

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

  1. Вписываем в отдельном столбце граничные условия для выборки.
  2. Условия в Microsoft Excel

  3. Как и в предыдущем способе, поочередно выделяем пустые столбцы новой таблицы и вписываем в них соответствующие три формулы. В первый столбец вносим следующее выражение:

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(($D$2=C2:C29);СТРОКА(C2:C29);"");СТРОКА(C2:C29)-СТРОКА($C$1))-СТРОКА($C$1))

    В последующие колонки вписываем точно такие же формулы, только изменив координаты сразу после наименования оператора ИНДЕКС на соответствующие нужным нам столбцам, по аналогии с предыдущим способом.

    Каждый раз после ввода не забываем набирать сочетание клавиш Ctrl+Shift+Enter.

  4. Результат выборки по нескольким условиям в Microsoft Excel

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

Изменение результатов выборки в Microsoft Excel

Способ 4: случайная выборка

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

  1. Слева от таблицы пропускаем один столбец. В ячейке следующего столбца, которая находится напротив первой ячейки с данными таблицы, вписываем формулу:

    =СЛЧИС()

    Эта функция выводит на экран случайное число. Для того, чтобы её активировать, жмем на кнопку ENTER.

  2. Случайное число в Microsoft Excel

  3. Для того, чтобы сделать целый столбец случайных чисел, устанавливаем курсор в нижний правый угол ячейки, которая уже содержит формулу. Появляется маркер заполнения. Протягиваем его вниз с зажатой левой кнопкой мыши параллельно таблице с данными до её конца.
  4. Маркер заполнения в Microsoft Excel

  5. Теперь у нас имеется диапазон ячеек, заполненный случайными числами. Но, он содержит в себе формулу СЛЧИС. Нам же нужно работать с чистыми значениями. Для этого следует выполнить копирование в пустой столбец справа. Выделяем диапазон ячеек со случайными числами. Расположившись во вкладке «Главная», щелкаем по иконке «Копировать» на ленте.
  6. Копирование в Microsoft Excel

  7. Выделяем пустой столбец и кликаем правой кнопкой мыши, вызывая контекстное меню. В группе инструментов «Параметры вставки» выбираем пункт «Значения», изображенный в виде пиктограммы с цифрами.
  8. Вставка в Microsoft Excel

  9. После этого, находясь во вкладке «Главная», кликаем по уже знакомому нам значку «Сортировка и фильтр». В выпадающем списке останавливаем выбор на пункте «Настраиваемая сортировка».
  10. Переход к настраиваемой сортировке в Microsoft Excel

  11. Активируется окно настройки сортировки. Обязательно устанавливаем галочку напротив параметра «Мои данные содержат заголовки», если шапка имеется, а галочки нет. В поле «Сортировать по» указываем наименование того столбца, в котором содержатся скопированные значения случайных чисел. В поле «Сортировка» оставляем настройки по умолчанию. В поле «Порядок» можно выбрать параметр как «По возрастанию», так и «По убыванию». Для случайной выборки это значения не имеет. После того, как настройки произведены, жмем на кнопку «OK».
  12. Настройка сортировки в Microsoft Excel

  13. После этого все значения таблицы выстраиваются в порядке возрастания или убывания случайных чисел. Можно взять любое количество первых строчек из таблицы (5, 10, 12, 15 и т.п.) и их можно будет считать результатом случайной выборки.

Случайная выборка в Microsoft Excel

Урок: Сортировка и фильтрация данных в Excel

Как видим, выборку в таблице Excel можно произвести, как с помощью автофильтра, так и применив специальные формулы. В первом случае результат будет выводиться в исходную таблицу, а во втором – в отдельную область. Имеется возможность производить отбор, как по одному условию, так и по нескольким. Кроме того, можно осуществлять случайную выборку, использовав функцию СЛЧИС.

Еще статьи по данной теме:

Помогла ли Вам статья?

 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

#1

05.09.2017 07:46:08

Добрый день, подскажите, что не так в моём коде

Нужно, чтобы макрос перебрал все фильтры, которые заданы массивом, копировал и вставлял определённое значение (в примере показано)

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

Код
Sub test()
Dim k As Long, a()
On Error Resume Next
Dim pvtItem As PivotItem
With pvtOne
With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("Клиент")
For Each pvtItem In .PivotItems
Select Case pvtItem
Case "1"
pvtItem.Visible = True
Case Else
pvtItem.Visible = False
End Select
Next pvtItem
End With
End With
On Error GoTo 0
a = [G1:G4].Value
With ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("Поставщик")
For k = 1 To UBound(a, 1)
If k Then
.PivotItems(k).Visible = True
Else:
.PivotItems(k).Visible = False
End If
Sheets(1).Activate
Range("d5").Copy
lstr = ActiveSheet.Cells(Rows.Count, 11).End(xlUp).Row
Range("l2" & lstr).Paste
Next
End With
End Sub

Прикрепленные файлы

  • книга1.xlsm (24.96 КБ)

Изменено: olom05.09.2017 07:47:01

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#2

05.09.2017 12:42:47

olom, простите, а Вы не усложняете себе искусственно задачу?
Кажется, что формула =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ() Вам помогла бы и без макроса…
Можно всех клиентов и поставщиков макросом вытянуть в ряд и автоматически им прописать формулы:

Код
Sub test2()
    Dim ClientRn As Range, postRn As Range
    Set ClientRn = [F1:F4]
    Set postRn = [G1:G4]
    [M1].Value = "Что должно получиться"
    curPos = 1
    For Each clientVal In ClientRn
        For Each postVal In postRn
            [M1].Offset(curPos, 0).Value = clientVal.Value
            [M1].Offset(curPos, 1).Value = postVal.Value
            [M1].Offset(curPos, 2).FormulaR1C1 = "=IFERROR(GETPIVOTDATA(""Цена"",R3C1,""Клиент"",RC13,""Поставщик"",RC14),0)"
            curPos = curPos + 1
        Next postVal
    Next clientVal
End Sub

Прикрепленные файлы

  • книга1 (1).xlsm (25.5 КБ)

Изменено: tolstak05.09.2017 12:43:19

In GoTo we trust

 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

tolstak, спасибо за ответ, нет, в моём случае это не сработает. Пример я выложил именно с целью, чтобы узнать, почему у меня не работает перебор фильтров. В реальном файле сводная построена на основе sql-запроса, в ней не работает формула «получить данные сводной таблицы» и суть реальной задачи другая. В примере я написал то, что должно получится для того, чтобы проверить перебор фильтров

Но ваш макрос интересный, спасибо, попробую его как-нибудь интегрировать в свой отчёт

PS: Хотя нет, формула «получить данные..» работает) Но тем не менее, мне нужно немного другое

Изменено: olom05.09.2017 13:27:03

 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

tolstak, и я так понимаю, ваш макрос выдаёт результат только если в сводной выбраны все поставщики и все клиенты. В моём случае это всё не поместиться на одном листе

 

Inexsu

Пользователь

Сообщений: 758
Регистрация: 29.06.2017

#5

05.09.2017 13:50:00

Цитата
olom написал: Range(«l2» & lstr).Paste

не должно работать

Изменено: Inexsu05.09.2017 14:04:27

Сравнение прайсов, таблиц — без настроек

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#6

05.09.2017 13:56:12

Доброе время суток.

Цитата
olom написал:
В реальном файле сводная построена на основе sql-запроса

Тогда зачем огород городить? Почему бы не тянуть данные о клиентах/поставщиках и суммах сразу SQL запросом в таблицу, а потом только фильтром по клиенту просматривать?

 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

#7

05.09.2017 14:00:31

Inexsu, изменил на это, суть в том, что не работает перебор фильров!)

Код
PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

Андрей VG, я в vba то не особо разбираюсь, в sql вообще ничего практически не понимаю. К тому же sql это совсем другой лес, у меня нет доступа к редактированию sql запросов. У меня есть таблица, которая есть. И на основе неё я и делаю свою задачу

 

tolstak

Пользователь

Сообщений: 471
Регистрация: 01.08.2017

#9

05.09.2017 14:19:25

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

Код
Sub var()
    Dim pt As PivotTable, clientPf As PivotField, posPf As PivotField
    Set pt = ActiveSheet.PivotTables("СводнаяТаблица1")
    Set clientPf = pt.PivotFields("Клиент")
    Set posPf = pt.PivotFields("Поставщик")
    Call Filter_PivotField(posPf, Application.Transpose([G1:G4]))
    Call Filter_PivotField(clientPf, Application.Transpose([F1:F4]))
    Range("D5").Copy
    Range("L" & Cells.Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub


'https://www.mrexcel.com/forum/excel-questions/547911-filter-pivot-table-values-array-cells.html
Private Sub Filter_PivotField(pvtField As PivotField, _
        varItemList As Variant)
    Dim strItem1 As String
    Dim i As Long
    On Error GoTo ErrorHandler:
    Application.ScreenUpdating = False
 
    strItem1 = varItemList(LBound(varItemList))
    With pvtField
        .PivotItems(strItem1).Visible = True
        For i = 1 To .PivotItems.Count
            If .PivotItems(i) <> strItem1 And _
                  .PivotItems(i).Visible = True Then
                .PivotItems(i).Visible = False
            End If
        Next i
        For i = LBound(varItemList) + 1 To UBound(varItemList)
            .PivotItems(varItemList(i)).Visible = True
        Next i
    End With
    Exit Sub
ErrorHandler:
    MsgBox "Error while trying to process item: " & varItemList(i)
End Sub

Прикрепленные файлы

  • книга1 (2).xlsm (24.64 КБ)

In GoTo we trust

 

olom

Пользователь

Сообщений: 82
Регистрация: 25.08.2016

#10

06.09.2017 06:17:53

tolstak, спасибо) Тут всё же не то, выбирается всё, что указано в диапазоне. А у меня есть сводная выгрузка в которой есть клиенты и поставщики. Рядом со сводной прописаны вычисления, итог того, что мне нужно выводится в таблицу на другом листе. То есть мне нужно, чтобы выбирался клиент 1 — поставщик 1, затем копировалась таблица с итогами на отдельный лист; далее клиент 1 — поставщик 2, копируется таблица с итогами ниже первой и так далее до клиент 4 — поставщик 7 (условно). Я, конечно, могу вручную прописать выбор поставщиков для каждого клиента, но это не слишком удобно, если вдруг нужно будет добавить или убрать клиента/поставщика

Вам в любом случае большое спасибо, что потратили время и попытались помочь

oleggy

7 / 7 / 0

Регистрация: 14.03.2013

Сообщений: 231

1

31.03.2016, 09:07. Показов 9895. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день.
Подскажите код перебора ячеек которые были выделены на листе НО именно тех ячеек которые отфильтрованные (видимые).
Т.е. я в эксель с помошью фильтра отфильтровал табицу, и в этой таблице выделил несколько ячеек.
И вот такой код:

Visual Basic
1
2
3
4
5
6
7
For i = 1 To Selection.Count 
  With Selection.Cells(i)
  ...  
  tmp = .Value ' сохраняем/работаем с текстом ячейки
  ...
  End With ' Selection.Cells(i)
Next

перебирает все ячейки, включая и те которые фильтр убрал из результатов. (не видимые)

Вопрос, подскажите код который будет корректно перебирать только отфильтрованные (видимые) выделенные ячейки.



0



Shersh

Заблокирован

31.03.2016, 09:20

2

Visual Basic
1
2
3
4
5
6
7
For i = 1 To Selection.Count
  If Selection.Cells(i).RowHeight Then
    With Selection.Cells(i)
       tmp = .Value ' сохраняем/работаем с текстом ячейки
    End With ' Selection.Cells(i)
  End If
Next



1



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

31.03.2016, 10:16

3

Можно не бежать циклом по всем ячейкам, а только по отфильтрованным

Visual Basic
1
2
3
4
5
For each rc in Selection.SpecialCells(xlVisible).Cells
  With rc
  tmp = .Value ' сохраняем/работаем с текстом ячейки
  End With
Next



1



oleggy

7 / 7 / 0

Регистрация: 14.03.2013

Сообщений: 231

31.03.2016, 10:57

 [ТС]

4

The_Prist, а как быть если я выделил только одну ячейку (т.е. не выделял по сути) просто выбрал одну ячейку.
В этом случае не получается прочитать ячейку. Цикл отрабатывает корректно один раз но вот в значении

Visual Basic
1
tmp = .Value

содержится пустота («»). Хотя я явно выбрал ячейку в которой есть текст..



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

31.03.2016, 11:28

5

Все просто, добавляем проверку:

Visual Basic
1
2
3
4
5
6
7
8
9
If Selection.Count = 1 then 'если выделена только одна ячейка - только её считываем
tmp = Selection.Value
else 'если более одной - цикл по видимым из выделенных
For each rc in Selection.SpecialCells(xlVisible).Cells
  With rc
  tmp = .Value ' сохраняем/работаем с текстом ячейки
  End With
Next
end if



1



7 / 7 / 0

Регистрация: 14.03.2013

Сообщений: 231

31.03.2016, 12:55

 [ТС]

6

The_Prist, я почему написал, думал есть более изящное решение..
Конечно, проверкой можно реализовать



0



The SpecialCells Does not actually work as it needs to be continuous. I have solved this by adding a sort funtion in order to sort the data based on the coloumns i need.

Sorry for no comments on the code as i was not planning to share it:

Sub testtt()
    arr = FilterAndGetData(Worksheets("Data").range("A:K"), Array(1, 9), Array("george", "WeeklyCash"), Array(1, 2, 3, 10, 11), 1)
    Debug.Print sms(arr)
End Sub
Function FilterAndGetData(ByVal rng As Variant, ByVal fields As Variant, ByVal criterias As Variant, ByVal colstoreturn As Variant, ByVal headers As Boolean) As Variant
Dim SUset, EAset, CMset
If Application.ScreenUpdating Then Application.ScreenUpdating = False: SUset = False Else SUset = True
If Application.EnableEvents Then Application.EnableEvents = False: EAset = False Else EAset = True
If Application.Calculation = xlCalculationAutomatic Then Application.Calculation = xlCalculationManual: CMset = False Else CMset = True
For Each col In rng.Columns: col.Hidden = False: Next col

Dim oldsheet, scol, ecol, srow, hyesno As String
Dim i, counter As Integer

oldsheet = ActiveSheet.Name


Worksheets(rng.Worksheet.Name).Activate

Worksheets(rng.Worksheet.Name).AutoFilterMode = False

scol = Chr(rng.Column + 64)
ecol = Chr(rng.Columns.Count + rng.Column + 64 - 1)
srow = rng.row

If UBound(fields) - LBound(fields) <> UBound(criterias) - LBound(criterias) Then FilterAndGetData = "Fields&Crit. counts dont match": GoTo done

dd = sortrange(rng, colstoreturn, headers)

For i = LBound(fields) To UBound(fields)
    rng.AutoFilter Field:=CStr(fields(i)), Criteria1:=CStr(criterias(i))
Next i

Dim rngg As Variant

rngg = rng.SpecialCells(xlCellTypeVisible)
Debug.Print ActiveSheet.AutoFilter.range.address
FilterAndGetData = ActiveSheet.AutoFilter.range.SpecialCells(xlCellTypeVisible).Value

For Each row In rng.Rows
    If row.EntireRow.Hidden Then Debug.Print yes
Next row


done:
    'Worksheets("Data").AutoFilterMode = False
    Worksheets(oldsheet).Activate
    If SUset Then Application.ScreenUpdating = True
    If EAset Then Application.EnableEvents = True
    If CMset Then Application.Calculation = xlCalculationAutomatic
End Function
Function sortrange(ByVal rng As Variant, ByVal colnumbers As Variant, ByVal headers As Boolean)

    Dim SUset, EAset, CMset
    If Application.ScreenUpdating Then Application.ScreenUpdating = False: SUset = False Else SUset = True
    If Application.EnableEvents Then Application.EnableEvents = False: EAset = False Else EAset = True
    If Application.Calculation = xlCalculationAutomatic Then Application.Calculation = xlCalculationManual: CMset = False Else CMset = True
    For Each col In rng.Columns: col.Hidden = False: Next col

    Dim oldsheet, scol, srow, sortcol, hyesno As String
    Dim i, counter As Integer
    oldsheet = ActiveSheet.Name
    Worksheets(rng.Worksheet.Name).Activate
    Worksheets(rng.Worksheet.Name).AutoFilterMode = False
    scol = rng.Column
    srow = rng.row

    If headers Then hyesno = xlYes Else hyesno = xlNo

    For i = LBound(colnumbers) To UBound(colnumbers)
        rng.Sort key1:=range(Chr(scol + colnumbers(i) + 63) + CStr(srow)), order1:=xlAscending, Header:=hyesno
    Next i
    sortrange = "123"
done:
    Worksheets(oldsheet).Activate
    If SUset Then Application.ScreenUpdating = True
    If EAset Then Application.EnableEvents = True
    If CMset Then Application.Calculation = xlCalculationAutomatic
End Function

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel для iPad Excel для iPhone Excel для планшетов с Android Excel для телефонов с Android Еще…Меньше

Функция ФИЛЬТР позволяет выполнять фильтрацию диапазона данных на основе условий, которые вы определяете.

Ваш браузер не поддерживает видео. Установите Microsoft Silverlight, Adobe Flash Player или Internet Explorer 9.

В следующем примере мы использовали формулу =FILTER(A5:D20,C5:C20=H2,»») для возврата всех записей Для Apple, как указано в ячейке H2, и если яблок нет, возвращается пустая строка («»).

Функция ФИЛЬТР: фильтрация по региону и продукту (яблоко)

Функция ФИЛЬТР фильтрует массив с учетом массива логических значений (ИСТИНА/ЛОЖЬ).

=ФИЛЬТР(массив;включить;[если_пусто])

Аргумент

Описание

массив

Обязательный элемент

Массив или диапазон для фильтрации

включить

Обязательный элемент

Массив логических переменных с аналогичной высотой или шириной, что и массив.

[если_пусто]

Необязательный элемент

Значение, возвращаемое, если все значения во включенном массиве пустые (фильтр не возвращает ничего)

Примечания: 

  • Массив может рассматриваться как ряд значений, столбец со значениями или комбинация строк и столбцов значений. В приведенном выше примере массив для нашей формулы ФИЛЬТР представляет собой диапазон A5:D20.

  • Функция ФИЛЬТР возвращает массив, который будет переноситься на другие ячейки, если является конечным результатом формулы. Это означает, что Excel будет динамически создавать соответствующий по размеру диапазон массива при нажатии клавиши ВВОД. Если ваши вспомогательные данные хранятся в таблице Excel, тогда массив будет автоматически изменять размер при добавлении и удалении данных из диапазона массива, если вы используете структурированные ссылки. Дополнительные сведения см. в статье о переносе массива.

  • Если набор данных потенциально может возвращать пустое значение, используйте третий аргумент ([если_пусто]). В противном случае возникнет ошибка #ВЫЧИС! , так как Excel в настоящее время не поддерживает пустые массивы.

  • Если какое-либо значение аргумента include является ошибкой (#N/A, #VALUE и т. д.) или не может быть преобразовано в логическое значение, функция FILTER вернет ошибку.  

  • Приложение Excel ограничило поддержку динамических массивов в операциях между книгами, и этот сценарий поддерживается, только если открыты обе книги. Если закрыть исходную книгу, все связанные формулы динамического массива вернут ошибку #ССЫЛКА! после обновления.

Примеры

Функция ФИЛЬТР, используемая для возврата нескольких условий

В данном случае мы используем оператор умножения (*) для возврата всех значений в диапазоне массива (A5:D20), содержащих текст «Яблоко» И находящихся в восточном регионе: =ФИЛЬТР(A5:D20;(C5:C20=H1)*(A5:A20=H2);»»).

Использование ФИЛЬТР с оператором умножения (*) для возврата всех значений в нашем диапазоне массива (A5:D20), содержащих текст "Яблоко" И находящихся в восточном регионе.

Функция ФИЛЬТР, используемая для возврата нескольких условий и сортировки

В данном случае мы используем предыдущую функцию ФИЛЬТР с функцией СОРТ для возврата всех значений в диапазоне массива (A5:D20), содержащих текст «Яблоко» И находящихся в восточном регионе, а затем для сортировки единиц в порядке убывания: =СОРТ(ФИЛЬТР(A5:D20;(C5:C20=H1)*(A5:A20=H2);»»);4;-1)

Использование функций ФИЛЬТР и СОРТ для возврата всех значений в диапазоне массива (A5:D20), содержащих текст "Яблоко" И находящихся в восточном регионе, а затем сортировки единиц в порядке убывания.

В данном случае мы используем функцию ФИЛЬТР с оператором сложения (+) для возврата всех значений в диапазоне массива (A5:D20), содержащих текст «Яблоко» ИЛИ находящихся в восточном регионе, а затем для сортировки единиц в порядке убывания: =СОРТ(ФИЛЬТР(A5:D20;(C5:C20=H1)+(A5:A20=H2);»»),4;-1).

Совместное использование ФИЛЬТР и СОРТ: фильтрация по продукту (яблоко) или по региону (Восток)

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

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

См. также

Функция СЛМАССИВ

Функция ПОСЛЕДОВ

Функция СОРТ

Функция СОРТПО

Функция УНИК

Ошибки #ПЕРЕНОС! в Excel

Динамические массивы и поведение массива с переносом

Оператор неявного пересечения: @

Нужна дополнительная помощь?

Like this post? Please share to your friends:
  • Excel перебор всех вариантов
  • Excel первыя ячейка диапазона
  • Excel первые три символа ячейки
  • Excel первые три буквы
  • Excel первые два слова в ячейке