【问题标题】:Advance AutoFilter to exclude certain values推进自动筛选以排除某些值
【发布时间】:2015-04-14 18:50:45
【问题描述】:

我想在 Excel 的工作表中过滤大量名称。在另一张表中,我包含了一个我想从较大列表中过滤和排除的名称列表。我将如何使用高级过滤器来做到这一点?我在下面尝试过这个,但它似乎不起作用。我的大列表在K2:K5000 中,我的标准在H2:H3 中(标准会增加,但我保持列表很小以进行测试)。任何帮助将不胜感激!

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

【问题讨论】:

  • 您能否提供一个您希望应用的标准示例?
  • 我认为有趣的问题。值得紫外线。顺便说一句,我发布了一个答案来说明您如何使用Advance Filter,但最有利的答案是@user3964075。它涵盖了所有基础:-)

标签: vba excel filter


【解决方案1】:

要使用高级过滤器排除 H2:H3 中的值来自K2:K5000,您可以使用以下方法:

  • 确保单元格K1 不为空(输入任何标题)
  • 找到 2 个未使用的单元格(例如 I1:I2
  • 离开I1blank
  • I2中输入以下公式

     =ISNA(MATCH(K2,$H$2:$H$3,0))
    
  • 使用以下代码排除行

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

【讨论】:

  • 绝对加一! :-) 这将处理多个值以过滤掉!
  • 很好的答案!我在您帮助解决的帖子中通过 VBA 自动构建公式!谢谢。 stackoverflow.com/a/65986101/5079799
【解决方案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 的“Operator:=xlFilterValues”参数进行过滤。随心所欲地构建数组,我选择通过构建带有 for 循环和拆分的字符串来实现(快速编写和测试,但由于多种原因并不理想)。

注意:自动筛选适用于标题,而不是数据。

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

【讨论】:

  • 谢谢。这会排除我在 H1:H3 中的值吗?
  • 我最初误解了你的问题,我已经适当地编辑了我的答案。我很抱歉。
【解决方案3】:

我认为您需要先了解如何使用高级过滤器。
有一个很好的教程你可以找到HERE

现在基于此,让我们举个例子。假设您有以下数据:

现在,假设您要过滤掉 Data1Data2。 根据链接,您可以使用公式作为标准,但是:

注意:始终将公式放在新列中。不要使用列标签或使用不在数据集中的列标签。创建对列 (B6) 中第一个单元格的相对引用。该公式的计算结果必须为 TRUE 或 FALSE。

所以在我们的例子中,我们的相对引用是A11(您要过滤的字段中的第一个单元格或项目)。
现在我们在B2 中创建一个公式,因为我们不能使用A2,它是一个列标签。
输入公式:=A11<>"Data1"

上面处理了 Data1,但我们还需要过滤掉 Data2
所以我们在C2 中创建另一个公式,即:=A11<>"Data2"

正确设置后,您现在可以手动或以编程方式应用Advance Filter。与您的代码类似的代码如下:

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

还有哈拉!我们已成功过滤掉 Data1Data2

结果:

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

补充:

我发现您在另一个工作表上有您的标准,因此您必须在公式中使用它。
因此,如果在我们的示例中您有 Data1Data2 在Sheet2 中的H2:H3 中,您在B2C2 中的公式分别为:=A11<>Sheet2!H2=A11<>Sheet2!H3

【讨论】:

    【解决方案4】:

    你甚至不需要 VBA 来达到同样的效果:

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

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

    其中 A2 是您要搜索的值,字段 2 是您要在其中搜索此值的范围的引用,1 是您要搜索的列的索引,FALSE 告诉 @ 987654322@ 只返回完全匹配。

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

      =IFERROR(G2, FALSE)

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

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

    这应该返回没有您想要排除的值的原始数据集。

    记录一个宏来执行此操作,这是一步而不是 5 以供将来使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2021-10-04
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      相关资源
      最近更新 更多