使用范围数组的多个标准的自动过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用范围数组的多个标准的自动过滤器相关的知识,希望对你有一定的参考价值。

来自问题Excel macro filter based on multiple cell values并使用Creating an Array from a Range in VBA的答案

我试图使用数组创建一个广泛的自动过滤器。但是,它只使用数组范围内的最新值。

如何使用过滤器中的所有值?

Sub Test()

Dim DirArray As Variant
DirArray = [A2:A5].Value2
ActiveSheet.range("$B$1:$C$10").AutoFilter Field:=2, Operator:=xlFilterValues, Criteria1:=DirArray

End Sub
答案

使用多个数值应用过滤器时记录宏显示过滤器需要一个字符串数组。

ActiveSheet.Range("$B$1:$C$11").AutoFilter Field:=2, Criteria1:=Array("1", "2", "3"), Operator:=xlFilterValues

enter image description here

请注意,data = [A2:A5].Value返回一个2D数组

enter image description here

让我们展平2D阵列:data = [A2:A5].Value

enter image description here

现在我们有一个数组,我们需要将它转换为一个String数组。

我们可以通过首先创建一个分隔的字符串来完成此操作

 Data = Join(Data, ",")

enter image description here然后分裂那个字符串

enter image description here

   ActiveSheet.Range("$B$1:$C$11").AutoFilter Field:=2, Operator:=xlFilterValues, _
Criteria1:=Split(Join(Application.Transpose(Range("A2:A6")), ","), ",")

enter image description here

TextJoin()真的简化了这个过程。

    ActiveSheet.Range("$B$1:$C$11").AutoFilter Field:=2, Operator:=xlFilterValues, _
Criteria1:=Split(WorksheetFunction.TextJoin(",", True, Range("A2:A6")), ",")
另一答案

在没有看到您的数据的情况下,我可以在您的代码中看到一个相互冲突的问题以及与您的数据发生其他冲突的可能

  1. AutoFilter期望Criteria1的简单1-D数组与operator:= xlfiltervalues。你正在传递二维数组。只需使用application.transpose将传入数据从2-D转换为1-D即可。 DirArray = Application.Transpose(.Range("A2:A5").value2)
  2. DirArray听起来不像是为存储数字而创建的变量,但值得一提的是,AutoFilter不喜欢将一系列真实数字传递给Criteria1;它希望文本看起来像数字。收集值后,运行它们并将真实数字转换为文本传真。 DirArray = Application.Transpose(.Range("A2:A5").value2) For i = LBound(DirArray) To UBound(DirArray) DirArray(i) = CStr(DirArray(i)) Next i

因此,处理这两个问题时,您应该没有问题作为条件传递数组。

Option Explicit

Sub Test()

    Dim DirArray As Variant, i As Long

    With ActiveSheet
        If .AutoFilterMode Then .AutoFilterMode = False

        DirArray = Application.Transpose(.Range("A2:A5"))
        For i = LBound(DirArray) To UBound(DirArray)
            DirArray(i) = CStr(DirArray(i))
        Next i
        .Range("$B$1:$C$10").AutoFilter Field:=2, Operator:=xlFilterValues, Criteria1:=DirArray
    End With

End Sub
另一答案

你可以用这个:

Sub arraytest2()

Dim DirArray As Variant

DirArray = ActiveSheet.Range("A1:A5")

ActiveSheet.Range("$B$1:$C$10").AutoFilter Field:=2, Operator:=xlFilterValues, Criteria1:=Array(ActiveSheet.Range("A" & LBound(DirArray) & ",A" & UBound(DirArray)))

End Sub

以上是关于使用范围数组的多个标准的自动过滤器的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

jsonpath的使用

React:使用多个复选框过滤数组列表

复制自动过滤范围,vba excel

如何在反应原生中过滤多个选择下拉字段中的数组值

如何自动选择范围而无需手动输入?