推进AutoFilter以排除某些值

时间:2015-02-13 16:45:34

标签: excel vba excel-vba filter

我想在Excel中过滤Sheet中的大型名称列表。在另一张表中,我包含了一个名称列表,我希望将其从较大的列表中过滤掉并排除。我如何使用高级过滤器来执行此操作?我在下面试过这个,但它似乎不起作用。我的重要名单位于K2:K5000,我的标准位于H2:H3(标准会增加,但我会将列表保留为小测试版)。任何帮助将不胜感激!

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

4 个答案:

答案 0 :(得分:3)

要使用高级过滤器从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 
    

答案 1 :(得分:2)

我不确定如何使用高级过滤器排除,但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

使用AutoFilter:

使用字符串数组作为条件,使用AutoFilter的“Operator:= xlFilterValues”参数进行过滤。根据需要构建你的数组,我选择通过构建一个带有for循环和拆分的字符串来做(快速编写和测试,但由于多种原因不理想)。

注意:AutoFilter应用于标题,而不是数据。

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

答案 2 :(得分:1)

我认为您首先需要了解如何使用高级过滤器 您可以找到一个很好的教程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!我们已成功过滤掉 Data1 Data2

<强>结果:

enter image description here

我花了一段时间才掌握它,但是由于上面的链接,我设法把它拉了下来。我今天也学到了一些新东西:-)。 HTH。

其他

我看到你在另一张专辑中有你的标准,所以你必须在公式中使用它。
所以如果在我们的例子中你有 Data1 Data2 H2:H3中,B2C2中的公式分别为:=A11<>Sheet2!H2=A11<>Sheet2!H3

答案 3 :(得分:0)

您甚至根本不需要VBA即可实现相同的结果:

  1. 在第一列中将值放入单独的电子表格中。
  2. 要在原始电子表格中过滤的数据旁边创建2个新列
  3. 在要过滤的数据旁边的第一列中,使用

    =VLOOKUP(A2, [nameOfOtherSpreadSheet.xlsx/xlsm/xls/etc]sheetName!$A:$A,1, FALSE)

其中A2是您要搜索的值,字段2是要在其中搜索该值的范围的参考,1是您要搜索的列的索引,而FALSE告诉{ {1}}仅返回完全匹配项。

  1. 在要过滤的数据旁边的第二列中,使用

    VLOOKUP

其中G2是可能返回错误的函数的引用,而FALSE是要在该函数引发错误时返回的值。

  1. 过滤要过滤FALSE的数据旁边的第二列

这应该返回原始数据集,但不包含您要排除的值。

记录一个宏以完成此操作,这是一步,而不是5个以备将来使用。