14 excel vba excel-2007 excel-2010
我在A列,1,2,3,4,5和A,B,C中有8个变量.
我的目标是过滤掉A,B,C并仅显示1-5.
我可以使用以下代码执行此操作:
My_Range.AutoFilter Field:=1, Criteria1:=Array("1", "2", "3","4","5"), _
Operator:=xlFilterValues
Run Code Online (Sandbox Code Playgroud)
但代码的作用是过滤变量1到5并显示它们.
我不会做相反的事情,但通过过滤出A,B,C并显示变量1到5,产生相同的结果
我试过这段代码:
My_Range.AutoFilter Field:=1, Criteria1:=Array("<>A", "<>B", "<>C"), _
Operator:=xlFilterValues
Run Code Online (Sandbox Code Playgroud)
但它没有用.
为什么我不能使用这段代码?
它给出了这个错误:
运行时错误1004范围类的autofilter方法失败
我怎么能这样做?
auc*_*ria 19
我认为(从实验 - MSDN在这里没有用),没有直接的方法来做到这一点.设置Criteria1为a Array等效于使用下拉列表中的复选框 - 正如您所说,它将仅根据与数组中某个项匹配的项过滤列表.
有趣的是,如果您有文字值"<>A"并"<>B"在列表中并对这些文件进行过滤,则会出现宏录制器
Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"
Run Code Online (Sandbox Code Playgroud)
哪个有效.但是,如果您具有文字值"<>C",并且在录制宏时过滤所有三个(使用勾选框),则宏录制器会精确复制您的代码,然后失败并显示错误.我想我称之为一个错误 - 你可以使用你无法用VBA做的UI做过滤器.
无论如何,回到你的问题.可以过滤不等于某些条件的值,但最多只能过滤两个不适合您的值:
Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd
Run Code Online (Sandbox Code Playgroud)
根据确切的问题,有几种可行的解决方法:
=ISNUMBER(A2),=NOT(A2="A", A2="B", A2="C")然后过滤TRUECriteria1:=">-65535"过滤器(或低于您预期的合适数量),这将过滤掉非数字值 - 假设这是您想要的例如:
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
Run Code Online (Sandbox Code Playgroud)