Функция циклического сопоставления слов в Excel VBA



У меня есть список ключевых слов, и я хочу посмотреть, содержит ли одна ячейка какое-либо из этих слов. Например, если мой список ключевых слов (кошка, собака, черепаха) функция будет ответный матч, если он смотрит внутрь "Мистер собак Волшебная страна". Я нашел хороший 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
478   2  

2 ответов:

Вставил это как есть в мой VBE, и я даже не смог скомпилировать.

Эта строка

StringFind = MyMatch(rng(I), source)

Необходимо заменить на

StringFind = MyMatch(rng(I).Value, source)
Даже заставить его работать на меня. Это может быть причиной вашей проблемы.

EDIT

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

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

Ниже код теперь будет искать значение в первом аргументе (Search, может быть "" текстом/String или одной ячейкой/Range) против всех значений во втором аргументе (Source A 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

1) Формула

Я бы сначала предложил не-VBA решение этой конкретной проблемы, так как VBA на самом деле не требуется. Эта формуламассива будет делать то же самое. Введите массив, нажав CTRL-SHIFT-ENTER, вы увидите фигурные скобки { } вокруг вашей формулы. Затем вы можете скопировать вниз.

'=IF(OR(ISNUMBER(SEARCH($F$1:$F$3, A1))), "Match", "No Match")

2) UDF

Используя тот же синтаксис, что и у вас, вот как я мог бы подойдите к этому с помощью 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

Comments

    Ничего не найдено.