使用excel vba过滤掉多个条件
A列中有8个variables,1,2,3,4,5和A,B,C
我的目标是过滤掉A,B,C,只显示1-5。
我可以使用下面的代码来做到这一点:
My_Range.AutoFilter Field:=1, Criteria1:=Array("1", "2", "3","4","5"), Operator:=xlFilterValues
但是代码做的是过滤variables1到5并显示它们。
我不想做相反的事情,但是通过筛选出A,B,C并显示variables1到5,得到相同的结果
我试过这个代码:
My_Range.AutoFilter Field:=1, Criteria1:=Array("<>A", "<>B", "<>C"), Operator:=xlFilterValues
但它没有工作。
为什么不能使用这个代码?
它给出了这个错误:
范围类的运行时错误1004 autofilter方法失败
我该怎么做?
我认为(从实验 – MSDN在这里是无益的),没有直接的方式做到这一点。 将一个Array
设置为Criteria1
相当于使用下拉框中的checkbox – 正如您所说的那样,它只会根据与数组中的项匹配的项来过滤列表。
有趣的是,如果你在列表中有文字值"<>A"
和"<>B"
Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"
哪个工作。 但是,如果你有字面值"<>C"
,并且在logging一个macros的时候过滤了所有三个(使用记号框),那么macroslogging器会精确地复制你的代码,然后错误地失败。 我想我会说这个错误 – 有filter,你可以做的使用用户界面,你不能用VBA做。
无论如何,回到你的问题。 可以过滤不等于某些条件的值,但只能过滤两个不适用于您的值:
Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd
有几个解决方法可能取决于确切的问题:
- 在列B中使用带有公式的“帮助列”,然后对其进行过滤 – 例如
=ISNUMBER(A2)
或=NOT(A2="A", A2="B", A2="C")
然后过滤TRUE
- 如果您不能添加列,请使用
Criteria1:=">-65535"
(或低于您的期望值的适当数字)的自动筛选器,这将过滤掉非数字值 – 假设这是您想要的 - 写一个VBA子来隐藏行(不完全一样的自动filter,但它可能已经满足您的需要)。
例如:
Public Sub hideABCRows(rangeToFilter As Range) Dim oCurrentCell As Range On Error GoTo errHandler Application.ScreenUpdating = False For Each oCurrentCell In rangeToFilter.Cells If oCurrentCell.Value = "A" Or oCurrentCell.Value = "B" Or oCurrentCell.Value = "C" Then oCurrentCell.EntireRow.Hidden = True End If Next oCurrentCell Application.ScreenUpdating = True Exit Sub errHandler: Application.ScreenUpdating = True End Sub
replace运算符:= xlOr与运算符:= xlAnd之间的标准。 见下面的修改脚本
myRange.AutoFilter字段:= 1,Criteria1:=“<> A”,运算符:= xlAnd,Criteria2:=“<> B”,运算符:= xlAnd,Criteria3:=“<> C”