我目前正在处理来自大型机的数据,而不是unlike the data presented here。在这种情况下,对于我的标准和目标数据集,我所有的字符串都类似于100-AAA。我已经搜索了类似的解决方案,但我还没有找到针对VBA上的范围问题的直接过滤器。
我正在尝试根据一系列标准过滤大型数据集。最初,我开始在单独的类/子例程中使用集合,但后来我在单个子例程中压缩到使用范围,如下所示:
Sub FilterTest1()
Dim RngOne As Range
Dim LastCell As Long
Sheets("Criteria").Activate
Sheets("Criteria").Select
Range("A1").Select
LastCell = Application.WorksheetFunction.CountA(ActiveSheet.Range("A:A"))
Set RngOne = ActiveSheet.Range("A2:A" & LastCell)
Sheets("Sheet 1").Activate
Sheets("Sheet 1").Select
With ActiveSheet
If .FilterMode Then
.ShowAllData
End If
End With
Columns("A:A").Select
Selection.AutoFilter
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RngOne, Operator:=xlOr
End Sub
不幸的是,即使使用Operator:=xlOr
等标准,我的单元格范围也不会过滤数据 - 它只显示用于条件的最后一个单元格值。 VBA代码不会失败 - 它只是不能根据范围正确过滤。
我确信存在一个简单的解决方案,但我看不到它。
答案 0 :(得分:7)
您当前的行:
ActiveSheet.Range("A:A").AutoFilter Field:=1, Criteria1:=RngOne, Operator:=xlOr
尝试按Range
对象过滤您的第一个字段,而不是按范围内的每个值过滤。
我已经提供了一种方法来执行此操作,方法是将值加载到数组中,然后将数组传递给过滤条件。
值得注意的几点可以帮助你(以及将来的任何人):
以下代码:
Sub FilterTest1()
Dim RngOne As Range, cell As Range
Dim LastCell As Long
Dim arrList() As String, lngCnt As Long
With Sheets("Criteria")
LastCell = .Range("A" & Sheets("Criteria").Rows.Count).End(xlUp).Row
Set RngOne = .Range("A2:A" & LastCell)
End With
'load values into an array
lngCnt = 0
For Each cell In RngOne
ReDim Preserve arrList(lngCnt)
arrList(lngCnt) = cell.Text
lngCnt = lngCnt + 1
Next
With Sheets("Sheet 1")
If .FilterMode Then .ShowAllData
.Range("A:A").AutoFilter Field:=1, Criteria1:=arrList, Operator:=xlFilterValues
End With
End Sub
答案 1 :(得分:3)
值得注意的是Criteria1
需要字符串变量作为参数。您可以为数组指定范围,然后将string
数组传递给条件。另一个注意事项是,要将数组传递给标准,据我所知,它必须在一行中,而不是列,例如。 StringArray(0,3)
代替StringArray(3,0)
。因此,为什么你得到你范围内的最后一个值。只需使用Application.Transpose(StringArray)
转换为行。
这一点代码对我有用,很容易扩展到更大的数组。
Sub test()
Dim StringArray(0, 1 To 3) As String 'This is a fixed dimension of an array, you can easily change to dynamic by using the ReDim statement.
ActiveSheet.AutoFilterMode = False 'To reset autofilter
Range("D3:D5").Select
For c = 1 To 3 'Step through the range that you wish to use as the criteria.
StringArray(0, c) = CStr(Selection(c, 1).Value)
Next
Range("A:A").AutoFilter Field:=1, Criteria1:=StringArray, Operator:=xlFilterValues
End Sub