2015-02-13 2 views
1

Я хочу фильтровать большой список имен в Листе в Excel. В другом листе я содержал список имен, которые я хочу отфильтровать и исключить из большего списка. Как я могу использовать расширенный фильтр для этого? Я пробовал это ниже, но он не работает. Мой главный список - K2:K5000, по моим критериям в H2:H3 (Критерии будут расти, но я сохранил список для тестирования). Любая помощь будет принята с благодарностью!Advance AutoFilter для исключения определенных значений

Sub Filter() 
    Sheet5.Range("K2:K5000").AdvancedFilter Action:=xlFilterInPlace, _ 
     CriteriaRange:=Sheets("Sheet3").Range("H2:H3"), Unique:=False 
End Sub 
+0

Можете ли вы дать образец критерия, который вы хотите применить? – CodeCamper

+0

Интересный вопрос, на мой взгляд. Заслуживает УФ. Кстати, я отправил ответ, чтобы проиллюстрировать, как вы работаете с «Advance Filter», но наиболее подходящим ответом будет @ user3964075. Он охватывает все базы :-) – L42

ответ

1

Я не уверен, что у верхней части моей головы, как вы будете использовать расширенный фильтр, чтобы исключить, но you can use formulas in your advanced filter (в нижней части). Вы можете, однако, просто использовать словарь для хранения значений, которые необходимо исключить, то исключить (скрыть строки или автофильтр на том не нашли в списке исключений)

Sub Filter() 
Dim i as integer 
Dim str as string 
Dim dict As Object 

Set dict = CreateObject("Scripting.Dictionary") 

With Worksheets("Sheet3") 
    For i = 2 To 3 
     str = CStr(.Range("H" & i).Value) 
     If Not dict.exists(str) Then 
      dict.Add str, vbNullString 
     End If 
    Next i 
End With 

With Sheet5 
    For i = 2 To 5000 
     str = CStr(.Range("K" & i).Value) 
     If Len(str) > 0 And dict.exists(str) Then 
      .Range("K" & i).EntireRow.Hidden = True 
     Elseif 
      'alternatively, you can add those that aren't found 
      'to an array for autofilter 
     End if 
    Next i 
End With 

'If building autofilter array, apply filter here. 

End Sub 

Использования автофильтра:

Использования массив строк в качестве критериев для фильтрации с аргументом «Operator: = xlFilterValues» AutoFilter. Создайте массив, как хотите, я решил сделать это, построив строку с циклом for и разбиением (быстро написать и протестировать, но не идеально по ряду причин).

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

With Sheet5 
    .AutoFilterMode = False 
    .Range("K1").AutoFilter _ 
     Field:=1, _ 
     Criteria1:=arr, _ 
     Operator:=xlFilterValues 
End With 
+0

Спасибо. Будет ли это исключать значения, которые у меня есть в H1: H3? –

+0

Я изначально неправильно понял ваш вопрос, я отредактировал свой ответ соответствующим образом. Мои извинения. – dleuschke

2

Чтобы исключить значения в H2:H3 из K2:K5000 с помощью расширенного фильтра можно использовать следующий подход:

  • Убедитесь, что клетка K1 не является пустым (введите любой заголовок)
  • Найти 2 неиспользуемую (например, I1:I2)
  • Оставить I1 пусто
  • Введите следующую формулу в I2

    =ISNA(MATCH(K2,$H$2:$H$3,0)) 
    
  • Используйте следующий код, чтобы исключить строки

    Sheet5.Range("K1:K5000").AdvancedFilter Action:=xlFilterInPlace, _ 
        CriteriaRange:= Sheets("Sheet3").Range ("I1:I2"), Unique:=False 
    
+0

Определенно плюс один! :-) Это будет обрабатывать несколько значений для фильтрации! – L42

1

Я думаю, вы должны сначала понять, как использовать Advance фильтр.
Существует хороший учебник, который вы можете найти HERE.

Теперь, опираясь на это, сделаем пример. Предположим, у вас есть ниже данные:

enter image description here

Теперь, давайте скажем, вы хотите, чтобы отфильтровать Data1 и Data2. Согласно, вы можете использовать формулу в качестве критериев, но:

Примечание: всегда размещайте формулу в новой колонке. Не используйте метку столбца или используйте метку столбца, которая не находится в вашем наборе данных. Создайте относительную ссылку на первую ячейку в столбце (B6). Формула должна оцениваться как TRUE или FALSE.

В нашем случае наша относительная ссылка A11 (первая ячейка или элемент в поле, которое вы хотите отфильтровать).
Теперь мы делаем формулу в B2, так как мы не можем использовать A2, это знак столбца.
Введите формулу: =A11<>"Data1".

enter image description here

Над позаботилась о Data1, но нам нужно отфильтровать Data2, а также.
Таким образом, мы делаем еще одну формулу C2, которая: =A11<>"Data2"

enter image description here

После правильной настройки, теперь вы можете применить Advance Filter вручную или программно. Код, аналогичный вашему, приведен ниже:

With Sheets("Sheet1") 
    .Range("A10:A20").AdvancedFilter xlFilterInPlace, .Range("A1:C2") 
End With 

И Hola! Мы успешно отфильтровали Данные1 и Данные2.

Результат:

enter image description here

Это мне потребовалось некоторое время, чтобы получить повесить его как хорошо, но благодаря этой ссылке выше, мне удалось вытащить его из.
Я тоже узнал что-то новое сегодня :-). НТН.

Дополнительно:

Я вижу, что у вас есть свои критерии, на другом листе, так что вы должны просто использовать, что в формуле.
Так что, если в нашем примере у вас есть Data1 и Data2 в H2:H3 в Лист2, ваша формула в B2 и C2 является: =A11<>Sheet2!H2 и =A11<>Sheet2!H3 соответственно.

Смежные вопросы