Vba 使用范围数组使用多个条件进行自动筛选

Vba 使用范围数组使用多个条件进行自动筛选,vba,excel,Vba,Excel,从问题中得出答案,并使用 我试图使用数组为大范围创建一个自动过滤器。 但是,它始终只使用数组范围内的最新值 如何使用过滤器中的所有值 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 您可以使用以下选项: S

从问题中得出答案,并使用

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

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

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
您可以使用以下选项:

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

在使用多个数值应用筛选器时录制宏表明筛选器需要一个字符串数组

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

让我们展平2D数组:
data=[A2:A5]。Value

现在我们有了一个1D数组,我们需要将它转换为一个字符串数组

我们可以通过首先创建一个分隔字符串来实现这一点

然后分开那根线

TextJoin()
确实简化了流程


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

  • 自动筛选要求Criteria1使用一个简单的一维数组,运算符为:=xlfiltervalues。您正在传入一个二维数组。只需使用application.transpose将传入数据从二维转换为一维

    DirArray = Application.Transpose(.Range("A2:A5").value2)
    
  • 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
    

    这可能有助于回答您的问题:它也只使用范围的最后一个值进行过滤。我没有正确理解您的问题,我做了一些编辑。。这就是你要找的吗?很好的完整答案:我很高兴你得到1000分:D
        ActiveSheet.Range("$B$1:$C$11").AutoFilter Field:=2, Operator:=xlFilterValues, _
    Criteria1:=Split(WorksheetFunction.TextJoin(",", True, Range("A2:A6")), ",")
    
    DirArray = Application.Transpose(.Range("A2:A5").value2)
    
    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