Excel VBA - 提高匹配功能的准确性

时间:2013-06-26 03:39:09

标签: excel-vba match vba excel

我在我的程序中使用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”等,此功能就会找到匹配,所以每当有字符串时包含在完整句子中的字符。

我想要的是让我的匹配功能只识别完整的单词。因此,在这种情况下,仅针对三个特定案例展示匹配:“Foxtrot”“Hotel”和“Foxtrot Hotel”。

我已经阅读了一个名为“lookat”的属性,它可以使用Find函数(lookat:= xlwhole)执行此类操作,您知道是否可以在我的Match函数中插入类似的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  • 错误( fo 后跟一个字母,而不是字边界)
  • 错误( 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