使用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 

有几个解决方法可能取决于确切的问题:

  1. 在列B中使用带有公式的“帮助列”,然后对其进行过滤 – 例如=ISNUMBER(A2)=NOT(A2="A", A2="B", A2="C")然后过滤TRUE
  2. 如果您不能添加列,请使用Criteria1:=">-65535" (或低于您的期望值的适当数字)的自动筛选器,这将过滤掉非数字值 – 假设这是您想要的
  3. 写一个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”