作者:yyyyyyyyyyyyy燁 | 来源:互联网 | 2023-05-21 15:17
我在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
但代码的作用是过滤变量1到5并显示它们.
我不会做相反的事情,但通过过滤出A,B,C并显示变量1到5,产生相同的结果
我试过这段代码:
My_Range.AutoFilter Field:=1, Criteria1:=Array("<>A", "<>B", "<>C"), _
Operator:=xlFilterValues
但它没有用.
为什么我不能使用这段代码?
它给出了这个错误:
运行时错误1004范围类的autofilter方法失败
我怎么能这样做?
1> aucuparia..:
我认为(从实验 - MSDN在这里没有用),没有直接的方法来做到这一点.设置Criteria1
为a Array
等效于使用下拉列表中的复选框 - 正如您所说,它将仅根据与数组中某个项匹配的项过滤列表.
有趣的是,如果您有文字值"<>A"
并"<>B"
在列表中并对这些文件进行过滤,则会出现宏录制器
Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B"
哪个有效.但是,如果您具有文字值"<>C"
,并且在录制宏时过滤所有三个(使用勾选框),则宏录制器会精确复制您的代码,然后失败并显示错误.我想我称之为一个错误 - 你可以使用你无法用VBA做的UI做过滤器.
无论如何,回到你的问题.可以过滤不等于某些条件的值,但最多只能过滤两个不适合您的值:
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子来隐藏行(与自动过滤器不完全相同,但根据您的需要可能就足够了).
例如:
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