我有一个关键字列表,想知道一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(Cat,Dog,Turtle),则该功能将返回MATCH,如果它正在查看“Mr. Dogs Magic Land”。我找到了一个很好的在线UDF作为函数使用,但当我尝试循环它以便它测试我的关键字列表上的每个单词时,我得到#VALUE!。第一个函数是我的循环,而第二个函数是在互联网上找到的UDF匹配函数(抱歉,不记得在哪里制作它的道具。)我尝试了字符匹配函数的变体,如InStr无济于事。 / p>
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
答案 0 :(得分:3)
1)FORMULA
我首先会为这个特定问题提供非VBA解决方案,因为不需要VBA。这个数组公式将做同样的事情。按CTRL-SHIFT-ENTER进入数组,你会看到公式周围出现花括号{}。然后你可以复制下来。
'= IF(或(ISNUMBER(搜索($ 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
答案 1 :(得分:0)
在我的VBE中按原样插入,我甚至无法编译。
这一行
StringFind = MyMatch(rng(I), source)
需要更改为
StringFind = MyMatch(rng(I).Value, source)
甚至让它为我工作。这可能是你问题的原因。
修改强>
好的,我更详细地回顾了所有内容。看起来这对你有用。 (对不起,我不是故意为你做这一切,但现在就是这样。)可能需要做一些调整才能使它适合你的需要。
问题在于您正在寻找未定义的数据类型(添加/更改了对As String
和As Range
的主函数调用)。虽然未定义的类型可以工作,但我认为看到问题出现的原因令人困惑。我试图在函数中设置一个断点,甚至没有那么远,因为传递了错误的数据类型。就个人而言,我总是使用Option Explicit
来帮助防止此类问题出现在我自己的代码中。
以下代码现在将针对所有值查找第一个参数(Search
中的值,可以是“”文本/ String
或单个单元格/ Range
)在第二个参数中(Source
一个Range
由单个或多个单元组成。)
Public Function StringFind(Search As String, Source As Range)
Dim rngCell As Range
For Each rngCell In Source.Cells
StringFind = MyMatch(Search, rngCell.Value)
If StringFind = "MATCH" Then Exit Function
Next rngCell
StringFind = "NO MATCH"
End Function
Function MyMatch(FindText As String, WithinText As Variant) As String
'
Dim vntFind As Variant
For Each vntFind In Split(UCase(FindText), " ")
If Len(Trim(vntFind)) > 0 Then
If vntFind = Trim(UCase(WithinText)) Then
MyMatch = "MATCH"
Exit Function
End If
End If
Next
MyMatch = "NO MATCH"
End Function