[我知道我可以在使用AutoFilter
的情况下使用VBA在Excel中过滤范围,例如:
Sub name()
ActiveSheet.Range("$A$12:$Y$74").AutoFilter Field:=22, Criteria1:="String"
End Sub)
...这项工作很好。但是,我正在努力使其更加复杂。有谁知道如何在VBA中实现以下示例?
我想做的是从List Box
中过滤选中的项目,并在每个选中的列表项目之间使用Operator:=xlAnd
。
示例:如果在下面的String1
中选中String2
和List Box
,则AutoFilter
函数应返回包含String1
和String2
的所有行。对于下表,该行将是第2行和第4行。
| 1 | String1 |
| 2 | String2, String1 |
| 3 | String2 |
| 4 | String1, String2, String3 |
| 5 | String3 |
| 6 | String1 |
| 7 | String3, String1 |
如果您有多个值要作为过滤依据,我要做的是将它们的值添加到数组中,然后使用数组中的值来过滤范围,如下所示:
Sub Autofiler_Array()
Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet
'declare and set the worksheet you are working with
Dim myarray As Variant
myarray = Array("String1", "String2", "String3")
'declare and assign values to Array
If ws.FilterMode Then ws.Range("$A$12:$Y$74").AutoFilter
'if Worksheet already is Filtered, then remove Autofilter
ws.Range("$A$12:$Y$74").AutoFilter Field:=22, Criteria1:=myarray, Operator:=xlFilterValues
'Autofilter with Array Values on Column 22 of the applicable range
End Sub
UPDATE:
阅读您的评论和更新的问题后,我相信以下内容将达到您想要的结果,而不是使用自动筛选,下面的代码将遍历您的行,检查单元格是否包含数组中的所有值,如果不隐藏它们行:
Sub Auto_Filter()
Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet
'declare and set the worksheet you are working with
Dim arrWords As Variant
arrWords = Array("String1", "String2")
'declare and assign values to Array
ws.Cells.EntireRow.Hidden = False
'unhide all rows
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'get last row with data in Column A
For i = 2 To LastRow
'loop through rows
For Each aWord In arrWords 'loop through Array values
If Not InStr(ws.Cells(i, 22).Value, aWord) > 0 Then
ws.Rows(i).EntireRow.Hidden = True
'if values from Array not found in cell, then hide row
End If
Next
Next i
End Sub
没有测试过,但是从理论上讲,它也可以使用自动过滤器:
Sub name()
ActiveSheet.Range("$A$12:$Y$74").AutoFilter Field:=22, Criteria1:="*String1*", _
Operator:=xlOr, Criteria2:="*String2*"
End Sub)
如果您可以将String1
和String2
修改为在代码或列表框中包含*
,我认为这应该可以找到那些方案。