用于选中的列表框项目的VBA自动筛选

问题描述 投票:0回答:2

[我知道我可以在使用AutoFilter的情况下使用VBA在Excel中过滤范围,例如:

Sub name()
ActiveSheet.Range("$A$12:$Y$74").AutoFilter Field:=22, Criteria1:="String"
End Sub)

...这项工作很好。但是,我正在努力使其更加复杂。有谁知道如何在VBA中实现以下示例?

我想做的是从List Box中过滤选中的项目,并在每个选中的列表项目之间使用Operator:=xlAnd

示例:如果在下面的String1中选中String2List Box,则AutoFilter函数应返回包含String1String2的所有行。对于下表,该行将是第2行和第4行。

enter image description here

| 1 | String1                   |
| 2 | String2, String1          |
| 3 | String2                   |
| 4 | String1, String2, String3 |
| 5 | String3                   |
| 6 | String1                   |
| 7 | String3, String1          |
excel vba autofilter
2个回答
1
投票

如果您有多个值要作为过滤依据,我要做的是将它们的值添加到数组中,然后使用数组中的值来过滤范围,如下所示:

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

0
投票

没有测试过,但是从理论上讲,它也可以使用自动过滤器:

Sub name()
ActiveSheet.Range("$A$12:$Y$74").AutoFilter Field:=22, Criteria1:="*String1*", _
Operator:=xlOr, Criteria2:="*String2*"
End Sub)

如果您可以将String1String2修改为在代码或列表框中包含*,我认为这应该可以找到那些方案。

© www.soinside.com 2019 - 2024. All rights reserved.