3

我在我的程序中使用了一个 Match 函数,它的主要目的是比较用户输入的输入,然后循环到数据库中,并在每次匹配时执行一些操作。

目前,我正在处理这个:

Function Match(searchStr As Variant, matchStr As Variant) As Boolean
Match = False
If (IsNull(searchStr) Or IsNull(matchStr)) Then Exit Function
If (matchStr = "") Or (searchStr = "") Then Exit Function

Dim f As Variant
f = InStr(1, CStr(searchStr), CStr(matchStr), vbTextCompare)
If IsNull(f) Then Exit Function
Match = f > 0

End Function

然后当它被使用时:

If Match(sCurrent.Range("A" & i).Value, cell.Value) Then

这是我的问题:

这太不准确了。如果我的数据库中有“Foxtrot Hotel”,只要用户键入“F”“Fo”“Fox”“ox”“xtro”“t hot”等等,这个函数就会找到一个匹配,所以只要有一个字符串包含在完整句子中的字符。

我想要的是让我的 Match 函数只识别完整的单词。因此,在这种情况下,仅显示三个特定案例的匹配项:“Foxtrot”“Hotel”和“Foxtrot Hotel”。

我已经阅读了一个名为“lookat”的属性,它可以使用 Find 函数 (lookat:=xlwhole) 来做这种事情,你知道是否可以在我的 Match 函数中插入类似的东西吗?

谢谢 !

4

1 回答 1

2

你可以像这样使用。这个仅对整个单词进行不区分大小写的匹配(使用正在搜索的单词周围的单词边界)。

  • False(fo后跟一个字母,而不是单词边界)
  • 真的
  • 真的
  • False(FOXTROT h后面没有字边界)

Find不适xlWhole用于您 - 这将看起来匹配整个单元格内容,而不是内容中的一个单词。

Function WordMatch(searchStr As Variant, matchStr As Variant) As Boolean
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "\b" & matchStr & "\b"
.ignorecase = True
WordMatch = .test(searchStr)
End With
Set objRegex = Nothing
End Function

Sub B()
Debug.Print WordMatch("foxtrot hotel", "fo")
Debug.Print WordMatch("foxtrot hotel", "hotel")
Debug.Print WordMatch("foxtrot hotel", "FOXTROT")
Debug.Print WordMatch("foxtrot hotel", "FOXTROT h")
End Sub
于 2013-06-26T05:20:20.873 回答