具有数组的AutoFilteR

时间:2019-05-19 11:45:56

标签: excel vba

我正在尝试通过查找单元格是否包含这些名称之一来过滤表,并在使用for时将其所有数据显示在一行中。

这是代码:

    Dim tab(3) as string '
    'tab(0) = "*valerie dupond*"'
'tab(1) = "*emanuel babri*"'
'tab(2) = "*raphael gerand*"'

For i = 0 To 2

'Worksheets("Feuil1").Range("A1").AutoFilter field:=2, Criteria1:=tab , ''Operator:=xlFilterValues'

'Next'

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,在数组上进行筛选时不能使用通配符(“/*")。

绕开该限制很困难,但并非不可能。我以前做过的方式是做这样的事情:

1)将您要过滤的列(我认为第2列)中的所有值都复制到一张空白纸上。

2)删除重复项。

3)循环浏览其余所有行,并删除所有不符合条件的行。

4)将其余值放入数组中。

5)过滤该阵列上的原始数据。

我没有访问代码的权限,但这类似于下面的内容。我没有测试。我现在不在使用Excel的计算机上,因此您必须清理它,修复错误并在Visual Basic中启用正则表达式。应该在“工具”->“参考”菜单中。您也可以稍微修改一下此代码,以进行操作。

Dim i As Integer

Dim c As Integer

Dim lRow As Integer

Dim regEx As New RegExp

Dim rEx As String

Dim arr(1) As String



lRow = Range(shSheet.Rows.Count, ActiveCell.Column).End(xlup).Row 'Get's the last row of the current column selected so make sure to select the column you are trying to filter.



rEx = "^.*(valerie dupond|emanuel babri|raphael gerand).*$" ' The test string for the Regular Expression to match


'Setting up the Regular Expression.

With regEx

.Global = True

.MultiLine = True

.IgnoreCase = False

.Pattern = strPattern

End With



i = 0 'Sets i to be looped through your values.

c = 1 'C will be set to store the values in the array.



'Loops through every row in your table trying to match the pattern above

For i to lRow

If regEx.Test(LCase(ActiveCell.Value)) Then
arr(c) = ActiveCell.Value

c = c + 1

ReDim Preserve arr(c)

End If

ActiveCell.Offset(1,0).Select
Next i



'Sets the filter

Worksheets("Feuil1").Range("A1").AutoFilter field:=2, Criteria1:=arr , ''Operator:=xlFilterValues

方法2:

两点:

  1. 您不需要FOR循环。 Criteria1 = tab将过滤所有条件,不需要循环
  2. 如果使用此数组方法搜索多个术语,则不能使用通配符。如果要使用通配符,则必须使用不同的语法,并且只能使用两个术语

代码2

只需删除通配符。例如,如果您只需要匹配“ valerie dupond”,而不必匹配“ valerie dupond夫人”

Sub FilterMe()
        Dim names(3) As String
        names(0) = "valerie dupond"
        names(1) = "emanuel babri"
        names(2) = "raphael gerand"
        Worksheets("Feuil1").Range("A1").AutoFilter field:=2, Criteria1:=names, Operator:=xlFilterValues
    End Sub

同样,您不能使用自动过滤器对通配符过滤两个以上的词