我正在尝试通过查找单元格是否包含这些名称之一来过滤表,并在使用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'
答案 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:
两点:
代码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
同样,您不能使用自动过滤器对通配符过滤两个以上的词