如何在VBA中查找多个字符串

时间:2015-05-21 20:50:04

标签: excel vba loops excel-vba filter

假设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中完成此操作?你会推荐哪种方式?

3 个答案:

答案 0 :(得分:2)

  

应选择或删除AbBa。我试图通过应用这个例程来识别“错误的案例”。

在我的评论之后,以下是使用.Find.FindNext

的示例

我的假设

  1. 我们正在使用Col A
  2. 中的Sheets("Sheet1")
  3. 我的阵列是预定义的。你可以使用你的阵列。
  4. 在下面的例子中,我将细胞着色为红色。适用时更改。

    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
    

    enter image description here

答案 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

将隐藏歹徒:

enter image description here

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

如果要返回与这些字符串匹配的单元格,则应以不同方式设置条件范围,删除<>并将条件放在单个列中,而不是放在相邻的行中。