Excel VBA自动过滤器 - “开始于”的多个标准

时间:2016-05-29 14:26:56

标签: excel vba excel-vba excel-2010 ms-office

我正在使用vba自动过滤Excel 2010中的列表,并希望基于3个或更多“开头”标准自动过滤列表(即“a *”,“b *”,“c *” )。不幸的是,据我所知,使用Operator:= xlOr只能有两个“开头”标准。

VBA Autofilter (Text Filters) With Multiple Criteria of "begin with"的已接受答案看起来会起作用。然而,循环遍历列表中的每个项目并将值添加到数组中,然后自动过滤与这些项目的完全匹配是麻烦的。特别是对于非常大的列表。

有没有更好的方法来自动过滤超过两个“以”标准开头?

2 个答案:

答案 0 :(得分:0)

注意:接受的答案,但OP正在使用之前在问题中提到的Gary的回答

假设我们有以下数据:

enter image description here

我们希望看到以 A D M 开头的项目。

运行此宏:

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

会产生: enter image description here

<强> 注意:

  • 这是一个“手动过滤”,而不是真正的AutoFilter
  • 如果您必须拥有自动筛选功能,请使用旧帖子中的方法

答案 1 :(得分:0)

  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