如何在VBA中find多个string

假定Excel工作表在随机列中包含以下值:

VARIABLE X AbbA AddA bbAA ccbb KaaC cccc ddbb ccdd BBaa ddbB Bbaa dbbd kdep mCca mblp ktxy 

现在应该同时在列中search几个单词和词组,例如以下内容:

(1)“bb”

(2)“cc”

(3)“d”

我把目标string放在一个数组中:

 Dim searchFor As String Dim xArr searchFor = "bb/cc/d" xArr = Split(searchFor , "/") 

同样假设“bb”是小写字母还是大写字母(在这种情况下不区分大小写)并不重要。 对于其他情况则区分大小写。 最后,我想根据相关的行select相应的目标案例。 还请注意,我想在select中包括目标string(例如“bb”)是单词的一部分(例如“dbbd”)的情况。

如果可能的话,忽略列标题(“VARIABLE X”)进行search/筛选以及最终select值。

如何在VBA中使用(1)filter和/或使用(2)常规循环来完成? 你会推荐哪种方式?

应该select或删除AbBa。 我试图通过应用这个例程来识别“错误的情况”。

继我的评论,这里是一个使用.Find.FindNext的例子

我的假设

  1. 我们正在与Sheets("Sheet1") Col A中的列Col A Sheets("Sheet1")
  2. 我的arrays是预定义的。 你可以使用你的数组。

在下面的例子中,我将单元格着色为红色。 按适用情况更改。

 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 

在这里输入图像说明

从列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可以用两个以上的选项来处理。

一种方法来删除这些将是使用高级筛选器。 当然,你不需要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 

如果要返回与这些string匹配的单元格,则可以按照不同的方式设置标准范围,删除<>并将条件放在一列中,而不是在相邻行中。