Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba中的循环词匹配函数_Vba_Loops_Excel_Match - Fatal编程技术网

excelvba中的循环词匹配函数

excelvba中的循环词匹配函数,vba,loops,excel,match,Vba,Loops,Excel,Match,我有一个关键字列表,想看看一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫、狗、海龟),那么如果函数正在查看“狗先生魔幻世界”,它将返回MATCH。我在网上找到了一个很好的UDF用作函数,但当我尝试循环它以测试关键字列表中的每个单词时,我得到了#VALUE!。第一个函数是我的循环,而第二个是在互联网上找到的UDF匹配函数(对不起,我不记得在哪里了,不过是制作它的人的道具)。我尝试了各种单词匹配函数,例如InStr,但都没有用 Function StringFind(rng(

我有一个关键字列表,想看看一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫、狗、海龟),那么如果函数正在查看“狗先生魔幻世界”,它将返回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

在我的VBE中插入这个,我甚至无法编译

这条线

StringFind = MyMatch(rng(I), source)
需要改成

StringFind = MyMatch(rng(I).Value, source)
甚至让它为我工作。这可能是您的问题的原因


编辑

好的,我更详细地复习了。看起来这对你有用。(对不起,我不是想为你做这一切,但它在这里。)它可能需要更多的调整,使其满足你的需要

问题是您正在查找未定义的数据类型(将主函数调用添加/更改为
作为字符串
作为范围
)。虽然未定义的类型可以工作,但我认为看到问题出现的原因是令人困惑的。我试图在函数中设置一个断点,但由于传递了错误的数据类型,我甚至没有做到这一点。就我个人而言,我总是使用
选项Explicit
来帮助防止类似问题在我自己的代码中出现

下面的代码现在将根据第二个参数中的所有值(
Source
a
Range
)查找第一个参数中的值(
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