Excel 倍数不等于<&燃气轮机;在VBA中实现自动筛选

Excel 倍数不等于<&燃气轮机;在VBA中实现自动筛选,excel,vba,Excel,Vba,所以我知道我可以使用这样的数组进行自动筛选: Temporary.Range("$A$1:$AB$" & RowCountTotal).AutoFilter Field:=24, Criteria1:=Array("1","2","3"), _ Operator:=xlFilterValues 同时,我知道我也可以使用as not equals,但我只允许有2个这样的: Temporary.Range(&q

所以我知道我可以使用这样的数组进行自动筛选:

Temporary.Range("$A$1:$AB$" & RowCountTotal).AutoFilter Field:=24, Criteria1:=Array("1","2","3"), _ Operator:=xlFilterValues
同时,我知道我也可以使用as not equals,但我只允许有2个这样的:

Temporary.Range("$A$1:$AB$" & RowCountTotal).AutoFilter Field:=24, Criteria1:=Array("<>1","<>2"), _ Operator:=xlFilterValues
Temporary.Range($A$1:$AB$”&RowCountTotal)。自动筛选字段:=24,标准1:=Array(“1”,“2”),o运算符:=xlFilterValues
当我做3的时候,我得到一个错误。问题是,我需要使用8次有效过滤排除8项。我的数据集相当大,因此无法逐行筛选,因为这将花费太长时间

我阅读了其他关于这方面的帖子,如:


但它们都是用来循环什么的,这是我不能用的。过滤后,我需要将过滤后的工作表复制到新工作表中。我应该如何处理这个问题?

如果您有一个范围可以用来放置条件,那么您可以使用高级过滤器来处理这个问题(您可以使用一个隐藏的工作表,或者使用与正在筛选的表位于同一工作表上的范围)

子测试仪()
Dim wsTemporary作为工作表,hdr,RowCountTotal作为长,filterColNum作为长
变暗rngTable作为范围,RNG过滤器作为范围,arrExclude,i作为长度,arrFilter
设置wsTemporary=ThisWorkbook.Worksheets(“temp”),其中包含您的数据
RowCountTotal=wsTemporary.Cells(Rows.Count,1).End(xlUp).Row
设置要筛选的rngTable=wsTemporary.Range($A$1:$AB$“&RowCountTotal)”范围
filterColNum=24'此列索引上的筛选器
hdr=rngTable.Cells(1,filterColNum).Value“要筛选的标题”
arrExclude=Array(2,4,5,6,10)’例如
标准值的ReDim arrFilter(1到2,1到UBound(ARREEXCLUDE)+1
'为筛选器范围内容构建数组
对于i=LBound(arrExclude)到UBound(arrExclude)
arrFilter(1,i+1)=hdr
arrFilter(2,i+1)=“”&arrExclude(i)
接下来我
'将标准表放在数据表下面
设置rngFilter=wsTemporary.Cells(RowCountTotal+10,1)_
.调整大小(UBound(arrFilter,1),UBound(arrFilter,2))
rngFilter.Value=arrFilter
'筛选表
rngTable.AdvancedFilter操作:=xlFilterPlace_
标准范围:=rngFilter_
唯一:=False
rngFilter.Clear“清理:删除条件表”
端接头
写入不存在的文件
选项显式
子写入不存在()
常数r计长=10
常量标准列表为String=“A、B、C、D、E、F、G、H”
Dim Criteria()作为字符串:Criteria=Split(CriteriaList,“”)
尺寸rg作为范围:设置rg=临时范围(“A1:AB”和rCount)
尺寸数据作为变量:数据=rg.值
长度为的Dim cCount:cCount=UBound(数据,2)
我长,j长,k长
对于i=1到r计数
如果IsError(Application.Match(数据(i,24),条件,0))那么
k=k+1
当j=1时,计算
数据(k,j)=数据(i,j)
下一个j
如果结束
接下来我
使用Temporary.Parent.Worksheets.Add
.Range(“A1”).Resize(k,cCount)。值=数据
以
端接头

可选Udf
RemoveExceptions()

使用MS 365/Excel 2019+的新动态数组功能,您可以将以下用户定义函数编码为任何动态公式输入的基础:

Function RemoveExceptions(DataRng As Range, exceptions, Optional LookUpCol As Long = 1)
'Note: Execptions can be as well a range as an array
    With Application
        Dim data: data = DataRng.Value
        Dim crit: crit = DataRng.Columns(LookUpCol)  ' data column to be matched
    '[1]Check positions
        Dim chk: chk = .Transpose(.Match(crit, exceptions, 0))
        Dim i As Long
        For i = LBound(chk) To UBound(chk)
            chk(i) = IIf(IsNumeric(chk(i)), "DELETE", i)
        Next
        chk = Filter(chk, "DELETE", False)      ' validrow positions
    '[2]Remove exceptions from data
        RemoveExceptions = .Transpose(.Index(data, chk, Evaluate("row(1:" & DataRng.Columns.Count & ")")))
    End With
End Function

可能的公式输入

您可以通过输入以下公式,例如在结果表的单元格
A2
中,根据排除标准显示要过滤的数据

  • 通过条件数组作为第二个参数(数据范围作为第一个参数,查找列=
    24
    作为第三个参数)
  • 或者通过一个额外的标准范围作为第二个参数

您无法避免循环,但可以将数据写入数组,然后在数组中循环,这比在单元格中循环快得多。如果你能分享这8个标准(条件),我会发布一个例子。想象一下条件是A,B,C,D等等。我想先把逻辑和想法写下来。提前非常感谢!范围(“a1”)和范围(“a2”)是什么意思?我不明白为什么这些单元格而不是D1或诸如此类的单元格,因为我们在您的示例中过滤列=4高级过滤器需要一个“标准范围”,其中标题对应于要过滤范围内的标题,下面的行包含用于过滤的值。上面的代码在单独的工作表上创建了一个标准范围(codename
filter
)。你试过了吗?还没有,他对如何实施感到困惑。因此,如果我要实现代码,我会将filtercolumn更改为24,将数组值和sheet1更改为现有的工作表?我应该保持过滤器部分不变吗?对不起,我对vba还比较陌生!我已经更新了我的示例,使其更接近您原来的帖子;仅供参考,您可能会对我的替代方案感兴趣,通过使用
Application.Index()
@TimWilliamsI进行较新的动态数组重组。我还没有动态数组,但使用Ctrl+Shift+Enter可以很好地工作。感谢您的响应,因为它帮助我看到它甚至可以在以前处理。当使用C+S+E作为常规数组公式输入时,空行全部为#N/A(因为您必须在与输入表大小相同的范围内填充数组公式,因为您不知道将排除多少行(如果有)
 =RemoveExceptions(temp!A2:AB100;{2;4;6;8};24)
 =RemoveExceptions(temp!A2:AB100;temp!AD2:AD6;24)