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 的答案
假设我们有这样的数据:
并且我们希望看到以 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
将产生:
注:
- 这是一个 "filter-by-hand" 而不是真正的自动过滤器
- 如果你绝对必须有一个自动过滤器,那么使用我的旧方法Post
- 只需先将所有内容读入数组即可,这很快就会结束。
- 使用数组对其执行一些逻辑。
- 从数组中剔除您不希望过滤器显示的每个值。
- 如果完成此操作,您将获得一个包含要显示的值的数组。
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
我在 Excel 2010 年使用 vba 自动过滤列表,并希望根据 3 个或更多 "begins with" 条件(即 "a*"、"b*"、"c*")。不幸的是,据我所知,使用 Operator:=xlOr.
只能有两个 "begins with" 条件有没有更好的方法来自动过滤两个以上的 "begins with" 条件?
注意:已接受的答案,但 OP 使用的是前面在问题中提到的 Gary 的答案
假设我们有这样的数据:
并且我们希望看到以 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
将产生:
注:
- 这是一个 "filter-by-hand" 而不是真正的自动过滤器
- 如果你绝对必须有一个自动过滤器,那么使用我的旧方法Post
- 只需先将所有内容读入数组即可,这很快就会结束。
- 使用数组对其执行一些逻辑。
- 从数组中剔除您不希望过滤器显示的每个值。
- 如果完成此操作,您将获得一个包含要显示的值的数组。
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