Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/57: Рейтинг темы: голосов - 57, средняя оценка - 4.82
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231

Как отфильтровать уже отфильтрованные значения таблице Excel

15.04.2013, 14:41. Показов 12038. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
С помошью команды:
Visual Basic
1
Workbooks("file.xls").Worksheets("Sheet1").UsedRange.AutoFilter Field:=1, Criteria1:=filter, Operator:=xlFilterValues
автоматически отфильтровал по первому полю таблицу с данными (UsedRange) по значению из массива filter.

А теперь как мне из этого отфильтрованного объема данных отфильтровать дополнительно но уже по другому полю (например №2)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2013, 14:41
Ответы с готовыми решениями:

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

Как подсчитать отфильтрованные записи в таблице?
Вопрос простенький, как подсчитать отфильтрованные записи в таблице

Как суммировать только отфильтрованные значения
Добрый день, Скажите, пожалуйста, как заставить excel считать сумму только тех ячеек, которые видны в конкретный момент времени....

42
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
22.04.2013, 10:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleggy Посмотреть сообщение
По идее если это отображает Excel то программно можно получить доступ к этим данным.
не всё можно сделать с помощью VBA-Excel, что можно сделать в самой программе "Excel".

Когда нет нужных VBA-Excel-средств, то нужно идти обходным путём.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
22.04.2013, 10:43  [ТС]
Да, но я не вижу другог способа как по варианту предложенному Казанског используя метод:
Visual Basic
1
.AutoFilter.Range.Сolumns(2).specialcells(xlcelltypevisible)
Т.е. этим сопособом считываю с список отфильтрованных значений в колонке №2 и далее из этого списка выбраю те значения по которым мы будем фильтровать колонку №2...
Все бы ничего но тут есть нюанс, который пояснить лучше на примере:

Пример:
Допустим после применения фильтра по колонке №1, в колонке №2 осталось 5 зачений (0,-1,2,4,2).
И допустим я хочу отфильтровать колонку №2 по значениям > 0.
То значит я должен способом Казанского считать из колоннке все данные больше 0 а это - (2,4,2).
И по этим данным отфильтровать эту колонку №2.
Но это неверно, т.к. фильровать нужно по уникальным значениям а не по повторяющимся. А уникальных знчений всего 2 - (2,4).

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

А если к примеру просто заглянуть в Excel в фильтры колонки №2 и просто увидель отсортированный список уникальных (неповторяющихся) значений для фильтрации. Красота!

Знать бы только как получить к ним доступ...
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
22.04.2013, 10:54
Цитата Сообщение от oleggy Посмотреть сообщение
А если к примеру просто заглянуть в Excel в фильтры колонки №2 и просто увидель отсортированный список уникальных (неповторяющихся) значений для фильтрации. Красота!
не предусмотрено в VBA-Excel это сделать.

Цитата Сообщение от oleggy Посмотреть сообщение
Значит дополнительно нужно городить методы удаляющие в массиве повторяющие значения и оставляющие только уникальные (я даже незнаю как безгеморно это сделать)
да, нужно что-то придумать, раз нет готовых средств.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
22.04.2013, 14:21
Получение массива критериев из автофильтра excel
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
22.04.2013, 14:24
Казанский, там (Получение массива критериев из автофильтра excel) то же, что и в этой теме или там что-то другое есть?
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
23.04.2013, 09:23  [ТС]
Вообщем Скрипт, это все тот же способ использования .AutoFilter.Filters(N), где N - номер колонки автофильтра.
И который работает если к колонка N была отфильтрована..
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
23.04.2013, 09:38
oleggy, значит вам нужно свой код писать, т.к. нет готового решения для вашей задачи.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
23.04.2013, 10:20  [ТС]
Казанский, Скрипт
Случаем не в курсе каким способом можно отсортировать Rage объект?
А так же как можно удалить первый элемент из объекта Rage (удаление заголовка фильтра) ?

Set r = .AutoFilter.Range.Сolumns(2).specialcell s(xlcelltypevisible)
Не могу понять из мануала каким образом работает метод:
r.Sort
Сортировка мне нужна что бы можно было из отсортированного списка легко удалить повторяющиеся значения и в итоге полученный список и будет списком потенциальных фильтров в колонке №2 в автофильтре.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
23.04.2013, 10:26
oleggy, здесь Получение массива критериев из автофильтра excel в сообщении #2 как раз и используется обходной путь решения вашей задачи.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
23.04.2013, 11:59  [ТС]
Скрипт, верно ли я понял что имелось ввиду использование объекта Scripting.Dictionary для обработки и сортировки данных?
Т.к. более ничего полезного для моего случая я в том примере не нашел.. (поправьте меня если ошибаюсь)
В том случае автор для осуществления сбора фильтров осуществляет перебор всех (!) данных в автофильтре что совсем не оптимально.
По мне лучше вариант коллекции видимых ячеек:
Visual Basic
1
.AutoFilter.Range.Columns(N).SpecialCells(xlCellTypeVisible)
и работать с ней.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
23.04.2013, 12:30
Цитата Сообщение от oleggy Посмотреть сообщение
верно ли я понял что имелось ввиду использование объекта Scripting.Dictionary для обработки и сортировки данных?
да, верно. Использование объекта "Dictionary" из библиотеки "Microsoft Scripting Runtime" очень удобно, когда нужно найти уникальные (неповторяющиеся) данные. Недостаток "Dictionary" в том, что при каком-то количестве элементов (точно не помню, кажется 300 тысяч) элементы начинают медленно добавляться в "Dictionary" (т.е. время работы кода увеличивается).

Вы можете воспользоваться и "SpecialCells(xlCellTypeVisible)" и "Dictionary" одновременно. Просматривайте только видимые ячейки и добавляйте их в "Dictionary". С помощью "Dictionary" можно взять только уникальные (неповторяющиеся данные).
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
23.04.2013, 13:52  [ТС]
Скрипт, можешь подсказать из за чего может ругатся VBA: User-defined type not defined

на выражение:
Visual Basic
1
2
Dim filter_data As Scripting.Dictionary
Set filter_data = New Scripting.Dictionary
менял на выражение:
Visual Basic
1
2
Dim filter_data
Set filter_data = New Scripting.Dictionary
или:
Visual Basic
1
Dim filter_data As New Scripting.Dictionary
так же ошибка.
VBA не понимает "Scripting.Dictionary"
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
23.04.2013, 13:55
oleggy, в данном коде должна быть подключена библиотека:
Tools - References... - Microsoft Scripting Runtime.

Чтобы библиотеку не подключать, нужно так в коде написать (могут быть опечатки - код не тестировал):
Visual Basic
1
2
Dim filter_data As Object
Set filter_data = CreateObject("Scripting.Dictionary")
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
23.04.2013, 14:06  [ТС]
Скрипт принципиально ли в коде VBA обязательно явно задавать:
Visual Basic
1
Dim filter_data As Object
чем плохо использование просто объявления переменной:
Visual Basic
1
Dim filter_data
Може я каких то основ не уловил..
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
23.04.2013, 14:11
oleggy, в данном случае нет разницы: что задать тип данных "Object", что не задать: код не станет легче писать. Может быть это защитит от какой-нибудь нелепой опечатки, если вдруг вместо работы с объектом будете работать с другим типом данных.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
24.04.2013, 07:23  [ТС]
В итоге получил код, котрый можно использовать для получения фильтров из той колонки автофильтра, которую мы НЕ ФИЛЬТРОВАЛИ.
Если же нам нужно получить список фильтров из колонки которая была отфильтрована, то код вы можете увидеть в том сообщении: Получение массива критериев из автофильтра excel

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
  ' задаем диапазон отфильтрованных ячеек (которые отображены) в колонке N автофильтра
Set filter_range = .AutoFilter.Range.Columns(N).SpecialCells(xlCellTypeVisible)
Set filter_data = CreateObject("Scripting.Dictionary") ' создаем объект словарь (ассоциативный массив)
 
On Error Resume Next ' пропуск ошибки при добавлении значения присутствующего в словаре
For Each cel In filter_range ' перебор всех ячеек в диапазоне
  ' добавление элемента в словарь, ключ и значение которого равны значению текущей ячейки
  filter_data.Add cel.Value, cel.Value
Next
On Error GoTo 0 ' выключение пропуска ошибок
  
filter_data.Remove filter_range.Value ' удаляем заголовок автофильтра из словаря т.к. он нам не нужен
Массив уникальных фильтров - filter_data.Items
К сожалению так и не могу понять почему следующая команда:
Visual Basic
1
.AutoFilter Field:=N, Criteria1:=filter_data.Items,  Operator:=xlFilterValues
не фильтрует.
Получается тот же самый результат о котором я писал в посте выше:
Как отфильтровать уже отфильтрованные значения таблице Excel
В том примере я фильтровал по неуникальным значениям. И я думал что это из-за того что значения неуникальны. Но по видимому не в этом причина.
0
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
26.04.2013, 08:27  [ТС]
Казанский, Скрипт
Случаем не в курсе из-за чего может возникнуть ошибка?

Код:
Visual Basic
1
2
3
4
Set r = .AutoFilter.Range.Сolumns(1).specialcells(xlcelltypevisible) 
for each сel in r
 ' работаю с cel
next
работает верно (перебирает все элементы в колонке 1) только если к данной колонке был применен фильтр.

Но он не работает если на листе есть автофильтр но в нем ничего не отфильтровано.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
26.04.2013, 08:41
oleggy, вот этот код у вас работает на листе, где есть автофильтр, но который не применён?

Код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Procedure_1()
 
    Dim shMy As Excel.Worksheet
    Dim myAutoFilter As Excel.AutoFilter
    
    Set shMy = ActiveSheet
    
    Set myAutoFilter = shMy.AutoFilter
    
    'Вывод результата в View - Immediate Window.
    Debug.Print myAutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Address
 
End Sub
1
7 / 7 / 0
Регистрация: 14.03.2013
Сообщений: 231
26.04.2013, 13:02  [ТС]
Спасибо, существует код котрый перебирает скрытые ячейки?

Visual Basic
1
2
3
4
Set r = .AutoFilter.Range.Сolumns(1).SpecialCells(xlCellTypeVisible)
for each сel in r
 ' работаю с cel
next
к сожалению свойства противоположного - xlCellTypeVisible, я не нашел..
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
26.04.2013, 13:28
Я помню делал так - сперва
set r=видимые
затем отображал всё, скрывал r - получаем видимыми ранее скрытые.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2013, 13:28

Как исключить из Comboboxa значения, которые уже были введены в ячейки Excel?
Вот, допустим, я ввожу данные в 4-х combobox'ax, после ввода нажатием кнопки, каждый combobox вводится в таблицу Excel, каждый комбобокс...

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

Экспорт в Excel отфильтрованные данные из подчиненной формы
Возникла следующая задача - в Аксе на форме есть подчиненная табличная форма, созданная на основе сохраненного SQL-запроса. Необходимо...

Как отфильтровать ячейки с формулами в 2007 Excel?
Здравствуйте. Как можно отфильтровать ячейки, отображаемый результат которых формируется забитыми в них формулами в Excel 2007? ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru