来自问题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
请注意,data = [A2:A5].Value
返回一个2D数组
让我们展平2D阵列:data = [A2:A5].Value
现在我们有一个数组,我们需要将它转换为一个String数组。
我们可以通过首先创建一个分隔的字符串来完成此操作
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")), ",")
在没有看到您的数据的情况下,我可以在您的代码中看到一个相互冲突的问题以及与您的数据发生其他冲突的可能
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
你可以用这个:
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