Расширенный фильтр в VBA Excel с комбинированным списком - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица Excel и комбинированный список с некоторыми значениями внутри.

Вот пример

enter image description here

Что бы я хотелсделать это:

Сделать расширенный фильтр с помощью vba на combobox1_change

Вот мой код:

Private Sub ComboBox1_Change()

Worksheets("Foglio1").Range("F1") = Me.ComboBox1.Value
a=Application.WorksheetFunction.CountA(Worksheets("Foglio1").Range("A1:B7"))
Worksheets("Foglio1").Range("A" & 1, "C" & a).AdvancedFilter xlFilterInPlace, Worksheets("Foglio1").Range("F1") 
End Sub

Но я могуt заставить его работать Должен ли я опубликовать ожидаемый вывод?

Это мой ожидаемый вывод:

enter image description here

1 Ответ

1 голос
/ 04 октября 2019

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

Private Sub ComboBox1_Change()
Dim lastr As Integer
lastr = Range("A" & Rows.Count).End(xlUp).Row
Sheets("Sheet1").Range("A1:C" & lastr).AutoFilter Field:=3, Criteria1:=ComboBox1.Value, Operator:=xlFilterValues
End Sub

Объяснение: последняя строка затемняется, чтобы принять целое число (числовое целое значение). Затем с помощью определяется самый надежный метод на сегодняшний день . Затем применяется диапазон от А1 до С и ваша последняя строка (например, A1:C7) и автофильтр. Поле - это столбец в пределах вашего диапазона, по которому он фильтруется, 3 в данном случае означает столбец C (если ваш диапазон был B: D, вместо 3 означает 3-й столбец в диапазоне, то есть столбец D). Критерием является значение, взятое непосредственно из вашего списка со значением ComboBox1.value. Оператор xlFilterValues ​​означает, что он будет фильтровать по значениям, найденным в столбце, что будет работать, даже если столбец имеет формулы.

Обратите внимание: вы можете получить значение непосредственно из выпадающего списка, нет необходимости ставитьсначала в ячейке, но вы можете сделать это, если хотите. Также в этом случае поиск последней строки ваших данных не является строго необходимым, просто укажите диапазон, как и Range("A:C").

РЕДАКТИРОВАТЬ: Я также исследовал .advancedfilter метод, и хотя я не знаю много об этом, вот мои выводы:

Private Sub ComboBox1_Change()
Dim sh As Worksheet: Set sh = ThisWorkbook.Sheets("Sheet1")
Dim lastr As Integer
If sh.FilterMode Then sh.ShowAllData
lastr = sh.Range("A" & Rows.Count).End(xlUp).Row
sh.Range("A1:C" & lastr).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=("Table1[#All]"), Unique:=False
End Sub

Примечания: есть комбинированный список со связанной ячейкой F2, диапазон F1: F2 находится в таблице, называемойТаблица 1. Я не заставил работать расширенный фильтр, не поместив его в таблицу из-за свойств расширенного фильтра. Заголовок таблицы 1 должен точно соответствовать заголовку столбца, по которому вы хотите выполнить фильтрацию. Если вы установите для заголовка тот же столбец, что и в столбце 1, он будет искать значение в таблице в столбце 1.

Объяснение: Рабочий лист dim устанавливает рабочий лист на текущий файл листа1. Это не является строго необходимым, но пригодится позже. lastr совпадает с прошлым разом, определите последнюю строку и примените фильтр к этому диапазону. Опять же, не обязательно, но в этом случае он немного ускоряется.

Значение If sh.FilterMode Then sh.ShowAllData важно для выбора нового значения. Он в основном сбрасывает фильтр, чтобы можно было применить новый фильтр. Он определяет, есть ли фильтр, примененный к вашему листу, а затем устанавливает его для отображения всех данных. Если фильтр не применен, это не нужно, но если вы пропустите тест и просто вставите showalldata, он потерпит неудачу, так как больше нечего показывать и выдавать ошибку, следовательно, тест. Если фильтр не сбрасывается при применении нового, он также выдаст ошибку, так как данные не найдены (потому что они отфильтрованы по предыдущему).

Затем расширенный фильтр применяется кдиапазон с вашими данными, как ранее. Критерии, которые следует здесь отметить: он принимает весь диапазон Table1, в данном случае только значение комбинированного списка ниже заголовка, идентичного столбцу 2. Затем расширенный фильтр скрывает все строки, которые не соответствуют этим данным.

Примечания: расширенный фильтр может иметь гораздо больше критериев, чем одно значение комбинированного списка.

Для каждой строки в Таблице 1 она будет обрабатывать ее как оператор ИЛИ: так что если в Таблице 1 у меня есть заголовок, аналогичный заголовку 2 с нижним значением A, и заголовок, аналогичный заголовку 3 с двумя строкаминиже этого значения B он будет искать диапазон для столбца 2, чтобы быть A ИЛИ столбец 3, чтобы быть B, и скрывает все, что не соответствует.

Header2 | Header3 'this will return rows with A under Header2 and rows with B under Header3
A       | 0
0       | B

Все критерии в одной строке используются как оператор AND. Если у меня есть два заголовка, как указано выше, но A и B находятся в одной строке, тогда фильтр будет искать строки с A и B на одной строке.

Header2 | Header3 'this will return rows with both A under Header2 and B under Header3
A       | B

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...