VBA фильтрация более 2 критериев - PullRequest
0 голосов
/ 07 января 2019

Я ищу простое решение проблемы фильтрации, которая у меня есть. Я пытаюсь отфильтровать следующие комбинации букв в поле 9: RB, RC и RG. Я попробовал несколько способов сделать это. Первый способ, которым я попробовал это было:

  Set Bigpic = Workbooks.Open("S:\NFInventory\groups\CID\CID Database\BigPic Files\BigPic 2018.xlsx", , , , , , , , True)
     lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
     Rows("1:1").Select
     Selection.AutoFilter
     ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Criteria1:="<>RB", Operator:=xlAnd, Criteria2:="<>RC", Operator:=xlAnd, Criteria3:="<>RG"

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

 Set Bigpic = Workbooks.Open("S:\NFInventory\groups\CID\CID Database\BigPic 
 Files\BigPic 2018.xlsx", , , , , , , , True)
     lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
     Rows("1:1").Select
     Selection.AutoFilter
     ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, 
 Criteria1:=Array("<>RB", "<>RC", "<>RG")

Ответы [ 4 ]

0 голосов
/ 21 марта 2019

Не могли бы вы просто создать столбец фильтра и вставить в него оператор if? Что-то вроде:

=IFERROR(FIND("RB",UPPER(C9)),0)+IFERROR(FIND("RC",UPPER(C9)),0)+IFERROR(FIND("RG",UPPER(C9)),0)

, а затем фильтр по этому столбцу = 0, чтобы исключить все RB, RC, RGs

0 голосов
/ 07 января 2019

Я вручную исключил более 2 критериев путем фильтрации по цвету. Если для вашей таблицы не задана заливка, этот код будет работать.

ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Criteria1:=Array("RB", _
    "RC", "RG"), Operator:=xlFilterValues
ActiveSheet.Range("A1:CU" & lrow).SpecialCells(xlCellTypeVisible).Interior.Color = 1 
' 1 is a black fill, change to your preference
ActiveSheet.Range("A1:CU" & lrow).AutoFilter Field:=9, Operator:= _
    xlFilterNoFill
'ActiveSheet.Range("A1:CU" & lrow).Autofilter Field:=9 
'this code will unfilter the range, can be used for testing to confirm everything you  _ 
expected to filter was filtered
0 голосов
/ 07 января 2019

Если не проблема иметь критерии на листе (можно скрыть)

enter image description here

В коде вы можете поместить критерии в скрытом листе

Range("C1:D9").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
    Sheets("Sheet2").Range("G1:I2"), Unique:=False      
0 голосов
/ 07 января 2019

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

dim i as long, lr as long, arr as object

set arr = createobject("scripting.dictionary")

with ActiveSheet

     lr = .Cells(Rows.Count, 1).End(xlUp).Row

     for i=2 to lr
         select case ucase(.cells(i, "I").value2)
             case "RB", "RC", "RG"
                 'do nothing
             case else
                 arr.item(.cells(i, "I").value2) = vbnullstring
         end select
     next i

     .Range("A1:CU" & lr).AutoFilter Field:=9, criteria1:=arr.keys, operator:=xlfiltervalues

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