2012-03-30 54 views
2

我有一个关键字列表,并希望查看一个单元是否包含这些单词中的任何一个。例如,如果我的关键字列表是(猫,狗,海龟),该功能将返回匹配,如果它正在看“狗先生魔术土地”。我发现了一个很好的UDF在线用作函数,但是当我尝试循环它时,它会测试关键字列表中的每个单词,我会得到#VALUE !.第一个函数是我的循环,第二个函数是在因特网上找到的UDF匹配函数(对不起,不记得在哪里,但是支持谁的支持)。我尝试过InStr等单词匹配函数的变体。Excel中的循环词匹配功能VBA

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

是的,我意识到它退出循环后,我不需要stringfind =“不匹配”的一部分,但它是一个想法... – postelrich 2012-03-30 13:45:50

回答

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 
+0

THX,但并没有帮助。仍然获得#VALUE! :( – postelrich 2012-03-30 14:18:08

+0

感谢解决了! – postelrich 2012-03-30 17:57:19

+0

很高兴听到它,请接受答案,让别人更容易找到它! – Gaffi 2012-03-30 18:02:14

3

1)FORMULA

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

“= IF(OR(ISNUMBER(SEARCH($ 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 
+0

+1为好阵列配方 – 2012-03-30 15:27:39

+0

真棒非vba公式! – postelrich 2012-03-30 17:56:25