【问题标题】:Autofilter with multiple criteria using an array of ranges使用范围数组自动过滤多个条件
【发布时间】:2018-07-06 19:20:39
【问题描述】:

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

【问题讨论】:

标签: vba excel


【解决方案1】:

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

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

注意data = [A2:A5].Value 返回一个二维数组

让我们展平二维数组:data = [A2:A5].Value

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

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

 Data = Join(Data, ",")

然后拆分该字符串

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

TextJoin() 确实简化了流程。

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

【讨论】:

  • 好完整的答案:我很高兴它给你带来了 1000 分:D
【解决方案2】:

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

  1. 自动过滤器期望 Criteria1 有一个简单的一维数组,其中包含 operator:=xlfiltervalues。您正在传递一个二维数组。只需使用 application.transpose 将传入的数据从二维转换为一维。

    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

【讨论】:

    【解决方案3】:

    你可以用这个:

    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
    

    【讨论】:

    • 它也只过滤 Range A 的最后一个值
    • 对不起,我没有正确理解你的问题,我做了一些修改..这是你要找的吗?
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2023-03-31
    • 2018-04-19
    • 2021-10-20
    相关资源
    最近更新 更多