Excel VBA中的循环字匹配功能

时间:2012-03-30 13:43:23

标签: excel vba loops excel-vba match

我有一个关键字列表,想知道一个单元格是否包含这些单词中的任何一个。例如,如果我的关键字列表是(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

2 个答案:

答案 0 :(得分:3)

1)FORMULA

我首先会为这个特定问题提供非VBA解决方案,因为不需要VBA。这个数组公式将做同样的事情。按CTRL-SHIFT-ENTER进入数组,你会看到公式周围出现花括号{}。然后你可以复制下来。

'= IF(或(ISNUMBER(搜索($ F $ 1:$ F $ 3,A1))),“匹配”,“不匹配”)

2)UDF

使用与您的语法相同的语法,以下是使用UDF进行此处理的方法。

enter image description here

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 StringAs 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