我有一个关键字列表,想查看一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫、狗、乌龟),则如果该函数正在查找“Mr. Dogs Magic Land”内部,则该函数将返回 MATCH。我在网上找到了一个很好的 UDF 用作该函数,但是当我尝试循环它以测试我的关键字列表中的每个单词时,我得到#VALUE!。第一个函数是我的循环,第二个是在互联网上找到的 UDF 匹配函数(抱歉不记得在哪里,但支持它的制作者。)我尝试过单词匹配函数的变体,例如 InStr,但没有成功。
Function StringFind(rng(), source)
For I = LBound(rng) To UBound(rng)
StringFind = MyMatch(rng(I), source)
If StringFind = "MATCH" Then Exit Function
Next I
StringFind = "NO MATCH"
End Function
Function MyMatch(FindText As String, WithinText As Variant) As String
'
Dim vntFind As Variant
Dim vntWithin As Variant
For Each vntFind In Split(UCase(FindText), " ")
If Len(Trim(vntFind)) > 0 Then
For Each vntWithin In Split(UCase(WithinText), " ")
If Len(Trim(vntWithin)) > 0 Then
If vntFind = vntWithin Then
MyMatch = "MATCH"
Exit Function
End If
End If
Next
End If
Next
MyMatch = "NO MATCH"
End Function
最佳答案
1) 公式
我首先会针对这个特定问题提供非 VBA 解决方案,因为实际上并不需要 VBA。这个数组公式会做同样的事情。按 CTRL-SHIFT-ENTER 输入数组,您将看到公式周围出现大括号 { }。然后就可以复制下来了。
'=IF(OR(ISNUMBER(SEARCH($F$1:$F$3, A1))), "匹配", "不匹配")
2) UDF
使用与您相同的语法,以下是我如何使用 UDF 来解决此问题。
Function MySearch(MyRNG As Range, MyStr As String) As String
Dim cell As Range
For Each cell In MyRNG
If LCase(MyStr) Like LCase("*" & cell & "*") Then
MySearch = "Match"
Exit Function
End If
Next cell
MySearch = "No Match"
End Function
关于vba - Excel VBA 中的循环单词匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944175/