Excel VBA 自动筛选器 - "begin with" 的多个条件

Excel VBA Autofilter - Multiple Criteria of "begin with"

我在 Excel 2010 年使用 vba 自动过滤列表,并希望根据 3 个或更多 "begins with" 条件(即 "a*"、"b*"、"c*")。不幸的是,据我所知,使用 Operator:=xlOr.

只能有两个 "begins with" 条件

的公认答案看起来可行。然而,循环遍历列表中的每个项目并将值添加到数组,然后自动过滤与这些项目的精确匹配是很麻烦的。特别是对于非常大的列表。

有没有更好的方法来自动过滤两个以上的 "begins with" 条件?

注意:已接受的答案,但 OP 使用的是前面在问题中提到的 Gary 的答案

假设我们有这样的数据:

并且我们希望看到以 ADM 开头的项目.

运行 这个宏:

Sub ThreeWay()
    Dim rng As Range, r As Range
    Set rng = Range("A2:A25")

    For Each r In rng
        v = Left(r.Value, 1)
        If v = "A" Or v = "D" Or v = "M" Then
            r.EntireRow.Hidden = False
        Else
            r.EntireRow.Hidden = True
        End If
    Next r
End Sub

将产生:

注:

  • 这是一个 "filter-by-hand" 而不是真正的自动过滤器
  • 如果你绝对必须有一个自动过滤器,那么使用我的旧方法Post
  1. 只需先将所有内容读入数组即可,这很快就会结束。
  2. 使用数组对其执行一些逻辑。
  3. 从数组中剔除您不希望过滤器显示的每个值。
  4. 如果完成此操作,您将获得一个包含要显示的值的数组。

Sub filter()

'ie. "a*", "b*", "c*").
'1 <==
filter_0 = Range(Range("A1"), Range("A2").End(-4121)).Value
filter_00 = Application.WorksheetFunction.Transpose(filter_0)

'2 <==
For i = LBound(filter_00) To UBound(filter_00)
    If Left(filter_00(i), 1) = "a" Then
    ElseIf Left(filter_00(i), 1) = "b" Then
    ElseIf Left(filter_00(i), 1) = "c" Then
    Else   '3 <==
        filter_00(i) = ""
    End If
Next i

'4 <==
With ActiveSheet.Range(Range("A1"), Range("A2").End(-4121))
    .AutoFilter FIELD:=1, Criteria1:=Array(filter_00), Operator:=7
End With

End Sub