excelvba中的循环词匹配函数
我有一个关键字列表,想看看一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫、狗、海龟),那么如果函数正在查看“狗先生魔幻世界”,它将返回MATCH。我在网上找到了一个很好的UDF用作函数,但当我尝试循环它以测试关键字列表中的每个单词时,我得到了#VALUE!。第一个函数是我的循环,而第二个是在互联网上找到的UDF匹配函数(对不起,我不记得在哪里了,不过是制作它的人的道具)。我尝试了各种单词匹配函数,例如InStr,但都没有用excelvba中的循环词匹配函数,vba,loops,excel,match,Vba,Loops,Excel,Match,我有一个关键字列表,想看看一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫、狗、海龟),那么如果函数正在查看“狗先生魔幻世界”,它将返回MATCH。我在网上找到了一个很好的UDF用作函数,但当我尝试循环它以测试关键字列表中的每个单词时,我得到了#VALUE!。第一个函数是我的循环,而第二个是在互联网上找到的UDF匹配函数(对不起,我不记得在哪里了,不过是制作它的人的道具)。我尝试了各种单词匹配函数,例如InStr,但都没有用 Function StringFind(rng(
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
在我的VBE中插入这个,我甚至无法编译 这条线
StringFind = MyMatch(rng(I), source)
需要改成
StringFind = MyMatch(rng(I).Value, source)
甚至让它为我工作。这可能是您的问题的原因
编辑 好的,我更详细地复习了。看起来这对你有用。(对不起,我不是想为你做这一切,但它在这里。)它可能需要更多的调整,使其满足你的需要 问题是您正在查找未定义的数据类型(将主函数调用添加/更改为
作为字符串
和作为范围
)。虽然未定义的类型可以工作,但我认为看到问题出现的原因是令人困惑的。我试图在函数中设置一个断点,但由于传递了错误的数据类型,我甚至没有做到这一点。就我个人而言,我总是使用选项Explicit
来帮助防止类似问题在我自己的代码中出现
下面的代码现在将根据第二个参数中的所有值(Source
aRange
)查找第一个参数中的值(Search
,可以是“text/String
或单个单元格/Range
),该值由单个或多个单元格组成
1)公式
我会首先为这个特殊的问题提供非VBA的解决方案,因为实际上并不需要VBA。这个数组公式也会做同样的事情。按CTRL-SHIFT-Enter键输入数组,您将看到大括号{}出现在公式周围。然后你可以抄下来
'=IF(或(ISNUMBER(搜索($F$1:$F$3,A1)),“匹配”,“不匹配”)
2)自定义项
使用与您相同的语法,下面是我如何使用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
是的,我知道退出循环后我不需要stringfind=“NO MATCH”部分,但这是一个想法……Thx,但没有帮助。仍然获得#值!:(很高兴听到。请接受答案,以便其他人更容易找到它!
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