Excel VBA通​​配符搜索

时间:2014-04-15 14:57:59

标签: excel vba excel-vba excel-2007 excel-2010

我目前有一个包含1列和多行的Excel文件。该列包含名字,姓氏和可能的中间名(例如:John Abe Smith)。我正在写一个有1个文本框和1个按钮的宏。在excel表中我有几个名字:

Column A
--------
John Abe Smith
Cindy Troll Bee
Randy Row
Joe Jumbo
Katie Kool Kat

我想编写一个宏,当我在文本框中输入内容并单击按钮时,它会在此列中查找名称。如果找到了,那就在消息框中说“找到”。

我想在搜索名字时使用通配符“*”,但我不知道如何。我目前有一些像这样的代码,但通配符不起作用:

Private Sub search_Click()
    For firstloop = 3 To 10
        If Range("G" & firstloop).Text = name.Text & "*" Then
            MsgBox "Found!"
            Exit Sub
        Else
            MsgBox "NOT FOUND"
        End If
    Next
End Sub

例如,假设我在文本框中输入“ Troll ”,然后单击按钮。我希望循环遍历列以查找包含“Troll”的任何内容。示例数据的结果只是Cindy Troll Bee

我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

您可以使用Like运算符(区分大小写):

Private Sub search_Click()
    For firstloop = 3 To 10
        If Range("G" & firstloop).Text Like name.Text & "*" Then
            MsgBox "Found!"
            Exit Sub
        Else
            MsgBox "NOT FOUND"
        End If
    Next
End Sub

不区分大小写的搜索使用:

If UCase(Range("G" & firstloop).Text) Like UCase(name.Text) & "*" Then

此外,如果您想确定单元格是否包含文本(不仅使用文本启动),您还可以使用(区分大小写) :

If InStr(1, Range("G" & firstloop).Text, name.Text) > 0 Then

或(不区分大小写的

If InStr(1, Range("G" & firstloop).Text, name.Text, vbTextCompare) > 0 Then

<强> UPD:

如果该点仅显示msgbox,那么我建议使用Application.Match

Private Sub search_Click()
    If Not IsError(Application.Match("abc" & "*", Range("G3:G10"), 0)) Then
        MsgBox "Found!"
    Else
        MsgBox "NOT FOUND"
    End If
End Sub

答案 1 :(得分:0)

您还可以避免循环并使用Range.Find方法。如果您希望区分大小写,则可以选择传递。 (默认情况下,它不区分大小写。)

Set rngFound= Range("G" & firstloop).Find(name.Text & "*") 
If rngFound Is Nothing Then
    MsgBox "Not Found!"
Else           
    MsgBox "FOUND"
End If