如何在Excel VBA函数中允许使用通配符*查找字符串中的单词?

时间:2017-02-12 09:55:40

标签: excel vba excel-vba

我有以下函数在字符串中查找单词,例如搜索don会找到Don而不是不是我想要的: “我不知道唐,你觉得怎么样?”

然而,我也发现我需要寻找像种族,种族,赛车这样的词汇。我希望能够搜索rac *以涵盖所有这些变体,而不是搜索每个变种。

是否可以更新代码来执行此操作?或者有人有任何代码可以解决这个问题吗?

  Function InStrExact(Start As Long, SourceText As String, WordToFind As String, _
  Optional CaseSensitive As Boolean = False)

  Dim x As Long, Str1 As String, Str2 As String, Pattern As String

  If CaseSensitive Then
    Str1 = SourceText
    Str2 = WordToFind
    Pattern = "[!A-Za-z0-9]"
  Else
    Str1 = UCase(SourceText)
    Str2 = UCase(WordToFind)
    Pattern = "[!A-Z0-9]"
  End If

  For x = Start To Len(Str1) - Len(Str2) + 1
    If Mid(" " & Str1 & " ", x, Len(Str2) + 2) Like Pattern & Str2 & Pattern _
       And Not Mid(Str1, x) Like Str2 & "'[" & Mid(Pattern, 3) & "*" Then
      InStrExact = x
      Exit Function
    End If
  Next
End Function

2 个答案:

答案 0 :(得分:0)

我会像下面这样说:

Function InStrExact(startPos As Long, sourceText As String, wordToFind As String, _
                     Optional CaseSensitive As Boolean = False) As Long

    Dim x As Long
    Dim actualSourceText As String, actualWordToFind As String, Pattern As String
    Dim word As Variant

    actualSourceText = Replace(Mid(sourceText, startPos), ",", "")
    If CaseSensitive Then
        Pattern = "[A-za-z]"
    Else
        actualSourceText = UCase(actualSourceText)
        actualWordToFind = UCase(wordToFind)
        Pattern = "[A-Z]"
    End If

    For Each word In Split(actualSourceText, " ")
        If CStr(word) Like actualWordToFind & Pattern Or CStr(word) = actualWordToFind Then
            InStrExact2 = x + 1
            Exit Function
        End If
        x = x + Len(word) + 1
    Next
    InStrExact = -1 '<--| return -1 if no match
End Function

答案 1 :(得分:0)

一个简单的修改是在搜索字符串的末尾添加一个通配符,并匹配原始字符串中的所有剩余字符。更改是替换此行:

If Mid(" " & Str1 & " ", x, Len(Str2) + 2) Like Pattern & Str2 & Pattern _

用这个:

If Mid(" " & Str1 & " ", x) Like Pattern & Str2 & Pattern & "*" _

这简单地消除了对要匹配的字符数的限制。如果在搜索词的末尾添加了通配符,则它位于尾随模式之前,因此允许任意数量的其他字符。如果搜索词中没有通配符,那么尾随模式仍然需要在搜索词之后立即出现,因此仍然需要完全匹配。

请注意,如果您要搜索的单词是最后一个单词并且您添加了通配符,则会出现问题。然后Str2的长度导致函数过早停止搜索。所以完整的解决方案是替换这一行:

 For x = Start To Len(Str1) - Len(Str2) + 1

用这个:

 For x = Start To Len(Str1)

没有必要提前停止检查。