2012-03-30 3 views
2

У меня есть список ключевых слов и вы хотите узнать, содержит ли одна ячейка какое-либо из этих слов. Например, если мой список ключевых слов (Cat, Dog, Turtle), функция вернет MATCH, если он будет искать внутри «Mr. Dogs Magic Land». Я нашел хороший UDF онлайн для использования в качестве функции, но когда я пытаюсь его закодировать, чтобы он проверял каждое слово в списке ключевых слов, я получаю #VALUE !. Первая функция - это мой цикл, а вторая - функция соответствия UDF, найденная в Интернете (извините, не помню, где, но реквизит для тех, кто ее создал.) Я пробовал варианты функций совпадения слов, таких как InStr, безрезультатно.Функция Looping Word Match в 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) 

даже заставить его работать на меня. Это МОЖЕТ быть причиной вашей проблемы.


EDIT

Хорошо, я рассмотрел все более подробно. Похоже, это сработает для вас. (Извините, я не хотел просто делать все это для вас, но вот оно.) Вероятно, для этого вам потребуется дополнительная настройка, чтобы она работала для ваших нужд.

Проблема заключалась в том, что вы искали неопределенные типы данных (добавленный/измененный вызов основной функции на As String и As Range). В то время как неопределенные типы могут работать, я думаю, что это путало в том, почему проблема возникла. Я попытался установить контрольную точку в функции и даже не получил так далеко, потому что был передан неправильный тип данных. Лично я всегда использую Option Explicit, чтобы предотвратить возникновение подобных проблем в моем собственном коде.

Ниже код теперь будет искать значение в качестве первого аргумента (Search, может быть «» текст/String или одна клетки/Range) против всех значений второго аргумента (SourceRange, состоящей из либо одна или несколько ячеек).

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 не очень нужен. Это массив формула будет делать то же самое. Введите массив, нажав CTRL-SHIFT-ENTER, вы увидите фигурные скобки {} появятся вокруг вашей формулы. Затем вы можете копировать.

= ЕСЛИ (ИЛИ (ISNUMBER (SEARCH ($ F $ 1: $ F $ 3, A1))), "Матч", "Нет Match")

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

потрясающая формула non vba! – postelrich

Смежные вопросы