假设Excel工作表在随机列中包含以下值:
VARIABLE X
AbbA
AddA
bbAA
ccbb
KaaC
cccc
ddbb
ccdd
BBaa
ddbB
Bbaa
dbbd
kdep
mCca
mblp
ktxy
现在应该同时搜索列中的几个单词和单词短语,例如:
(1)“bb”
(2)“cc”
(3)“d”
我把目标字符串放在一个数组中:
Dim searchFor As String
Dim xArr
searchFor = "bb/cc/d"
xArr = Split(searchFor , "/")
同样假设“bb”是小写字母还是大字母(在这种情况下不区分大小写)并不重要。对于其他情况,它区分大小写。 最后,我想根据相关行选择相应的目标案例。另请注意,我希望在选择中包含案例,其中目标字符串(例如“bb”)是单词的一部分(例如“dbbd”)。
如果可能,请忽略用于搜索/过滤的列标题(“VARIABLE X”)以及最终的值选择。
如何使用(1)过滤器和/或使用(2)常规循环在VBA中完成此操作?你会推荐哪种方式?
答案 0 :(得分:2)
应选择或删除AbBa。我试图通过应用这个例程来识别“错误的案例”。
在我的评论之后,以下是使用.Find
和.FindNext
我的假设
Col A
Sheets("Sheet1")
在下面的例子中,我将细胞着色为红色。适用时更改。
Sub Sample()
Dim MyAr(1 To 3) As String
Dim ws As Worksheet
Dim aCell As Range, bCell As Range
Dim i As Long
Set ws = ThisWorkbook.Sheets("Sheet1")
MyAr(1) = "bb"
MyAr(2) = "cc"
MyAr(3) = "d"
With ws
'~~> Loop through the array
For i = LBound(MyAr) To UBound(MyAr)
Set aCell = .Columns(1).Find(What:=MyAr(i), LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
Set bCell = aCell
aCell.Interior.ColorIndex = 3
Do
Set aCell = .Columns(1).FindNext(After:=aCell)
If Not aCell Is Nothing Then
If aCell.Address = bCell.Address Then Exit Do
aCell.Interior.ColorIndex = 3
Else
Exit Do
End If
Loop
End If
Next
End With
End Sub
答案 1 :(得分:1)
从 A 栏中的数据开始,
Sub qwerty()
Dim i As Long, N As Long
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To N
t = LCase(Cells(i, 1).Text)
If InStr(t, "bb") + InStr(t, "cc") + InStr(t, "d") = 0 Then
Cells(i, 1).EntireRow.Hidden = True
End If
Next i
End Sub
将隐藏歹徒:
AutoFilter可能有两个以上的选择。
答案 2 :(得分:1)
删除这些内容的一种方法是使用高级过滤器。当然,你不需要VBA,但是使用VBA:
选项明确
Sub FilterByStrings()
Dim rData As Range
Dim rFiltered As Range
Dim rCriteria As Range
Dim vStrings As Variant, critStrings() As Variant
Dim I As Long
vStrings = VBA.Array("bb", "cc", "d")
Set rData = Range("a1", Cells(Rows.Count, "A").End(xlUp))
Set rFiltered = Range("B1")
Set rCriteria = Range("c1")
'Add the wild cards and the column headers
ReDim critStrings(1 To 2, 1 To UBound(vStrings) + 1)
For I = 0 To UBound(vStrings)
critStrings(1, I + 1) = rData(1, 1)
critStrings(2, I + 1) = "<>*" & vStrings(I) & "*"
Next I
'criteria range
Set rCriteria = rCriteria.Resize(UBound(critStrings, 1), UBound(critStrings, 2))
rCriteria = critStrings
rData.AdvancedFilter Action:=xlFilterCopy, criteriarange:=rCriteria, copytorange:=rFiltered
rCriteria.EntireColumn.Clear
End Sub
如果要返回与这些字符串匹配的单元格,则应以不同方式设置条件范围,删除<>
并将条件放在单个列中,而不是放在相邻的行中。