2012-03-30 8 views
2

私はキーワードのリストを持っており、1つのセルにこれらの単語のいずれかが含まれているかどうかを確認したいと考えています。たとえば、私のキーワードリストが(Cat、Dog、Turtle)の場合、関数は "Mr. Dogs Magic Land"の中を見ていればMATCHを返します。私は関数として使用するには良いUDFオンラインを見つけましたが、ループすると、キーワードリストのすべての単語をテストして#VALUEになります。最初の関数は私のループですが、2番目はインターネット上にある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 =「NO MATCH」の部分は必要ありません実現が、それはアイデア... – postelrich

答えて

0

これを私のVBEにそのまま接続しても、コンパイルできませんでした。

このライン

StringFind = MyMatch(rng(I), source) 

でも、それは私のために動作させるために

StringFind = MyMatch(rng(I).Value, source) 

に変更する必要があります。これはあなたの問題の原因かもしれません。


[OK]をEDIT

、私はより詳細にすべてを見直しました。これはあなたのために働くように見えます。 (申し訳ありませんが、私はあなたのためにすべてをするつもりはありませんでしたが、ここにあります)あなたのニーズに合うようにするには、多少の微調整が必​​要になるでしょう。

問題は、定義されていないデータ型(追加/変更されたメイン関数呼び出しはAs StringAs Range)を探していたことでした。未定義の型は機能しますが、なぜ問題が発生しているのか分かりにくいと思います。関数内にブレークポイントを設定しようとしましたが、間違ったデータ型が渡されたために遠くまで到達しませんでした。個人的には、私はいつもOption Explicitを使用して、このような問題が自分のコードで発生しないようにします。

以下のコードは、現在からなる第二引数のすべての値に対して(SourceRange(「」テキスト/ String又は単一セル/ Rangeすることができ、Search)最初の引数の値を探ししますか単一または複数の細胞)。

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

+0

感謝! – postelrich

+0

他の人がより簡単にそれを見つけることができますので、それを聞いてうれしい。、答えを受け入れてください!素敵な配列数式のため – Gaffi

3

1)VBAが本当に必要されていないので、私が最初にこの特定の問題に非VBAソリューションを提供しますFORMULA

。この配列の式も同じことをします。 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。 –

+0

素晴らしい以外のVBA式! – postelrich