使用一系列范围自动过滤多个条件

时间:2018-07-06 08:39:21

标签: excel vba excel-vba

来自问题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

3 个答案:

答案 0 :(得分:6)

在应用使用多个数值的过滤器时记录宏,表明该过滤器需要一个字符串数组。

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

现在我们有了一维数组,我们需要将其转换为字符串数组。

我们可以先创建一个分隔字符串

 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 :(得分:1)

在没有看到您的数据的情况下,我可以看到您的代码中有一个冲突的问题,还有可能与您的数据有另一个冲突。

  1. 自动筛选器期望Criteria1具有一个简单的一维数组,并带有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

答案 2 :(得分:0)

您可以使用此:

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