Автофильтр в VBA с критериями в виде диапазона ячеек

Я хочу использовать автофильтр в vba для фильтрации с использованием динамического диапазона значений ячеек.

ActiveSheet.Range("$A$1:$I$954092").AutoFilter Field:=1, Criteria1:=???? _
Operator:=xlFilterValues

Я хочу использовать динамический диапазон ячеек, например

Range("A1",Range("A1").End(xlDown))

Подскажите, как это указать?

Я пробовал передать в Criteria1 следующее:

Range(###).Value
Array(Range(###))

и т.п.

Ex.

Col1    Col2    Col3    Col4
----------------------------
 A        1       3       Y
 B        3       3       N
 A        2       2       N
 C        6       1       Y
 B        9       3       Y

Я хочу отфильтровать строки со значениями A и C в Col1.


person Vamsi    schedule 10.07.2014    source источник
comment
Фильтрация по нескольким критериям упрощается с помощью расширенного фильтра. Взгляните, например, здесь   -  person xificurC    schedule 10.07.2014
comment
Расширенный фильтр работает там, где есть определенный фильтр для каждого столбца данных. Мне нужен фильтр для одного столбца с выбором нескольких значений в данных этого столбца.   -  person Vamsi    schedule 10.07.2014
comment
на самом деле расширенный фильтр работает и для этого, попробуйте. Создайте столбец данных с таким же заголовком, следуя вашему примеру Col1, и под ним поместите A и C в следующие строки. Теперь выберите расширенный фильтр для ваших данных и в критериях фильтрации поместите все это вместе с заголовком столбца.   -  person xificurC    schedule 11.07.2014


Ответы (3)


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

Sub Macro1()
    Range("A1:C20").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$C$20").AutoFilter Field:=2, Criteria1:=Array( _
        "Alice", "Boris", "Mike"), Operator:=xlFilterValues
End Sub

Итак, AutoFilter требует массив на основе 1 для Criteria1

Допустим, нужный список находится на листе xx в столбце A. Мы сделаем массив из этого списка:

Sub Macro11()
    Dim N As Long, r As Range
With Sheets("xx")
        N = .Cells(Rows.Count, "A").End(xlUp).Row
        ReDim ary(1 To N)
        For i = 1 To N
            ary(i) = .Cells(i, 1)
        Next i
End With

    Range("A1:C20").AutoFilter
    ActiveSheet.Range("$A$1:$C$20").AutoFilter Field:=2, Criteria1:=ary, Operator:=xlFilterValues
End Sub
person Gary's Student    schedule 10.07.2014

Как упоминалось в @xificurC, расширенный фильтр делает свое дело! Мне удалось использовать следующий код для одновременной фильтрации нескольких значений, используя только ссылку на диапазон

Range("A1:A6").AdvancedFilter Action:=xlFilterInPlace, 
    CriteriaRange:=Range("A10:A12"), Unique:=False
person Vamsi    schedule 12.10.2014

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

Dim lr As Long
lr = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
ActiveSheet.Range("$A$1:$I$" & lr).AutoFilter Field:=1, Criteria1:="Foo"

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

person sous2817    schedule 10.07.2014
comment
То, что вы говорите, относится к Activesheet.Range, я хочу указать его для параметра Criteria1, где вы указали как Foo - person Vamsi; 10.07.2014
comment
@Vamsi, ты должен мне это сказать, я не вижу макета твоей книги. ActiveSheet можно использовать, если в вашем коде VBA нет множества других операторов .Select или .Activate. Если вы это сделаете, трудно гарантировать, что вы находитесь там, где вы думаете, когда запускается код фильтра. - person sous2817; 10.07.2014