Функция циклического сопоставления слов в 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
2 ответов:
Вставил это как есть в мой VBE, и я даже не смог скомпилировать.
Эта строка
StringFind = MyMatch(rng(I), source)
Необходимо заменить на
Даже заставить его работать на меня. Это может быть причиной вашей проблемы.StringFind = MyMatch(rng(I).Value, source)
EDIT
Хорошо, я рассмотрел все более подробно. Похоже, это сработает на вас. (Извини, я не хотел делать все это только для тебя, но вот оно.) Это, вероятно, нуждается в некоторой дополнительной настройке, чтобы заставить его работать для вашего потребности.
Проблема заключалась в том, что вы искали неопределенные типы данных (добавлен/изменен вызов основной функции
As String
иAs Range
). Хотя неопределенные типы могут работать, я думаю, что это сбивало с толку, видя, почему возникла проблема. Я попытался установить точку останова в функции и даже не смог зайти так далеко, потому что передавался неправильный тип данных. Лично я всегда используюOption Explicit
, чтобы предотвратить возникновение подобных проблем в моем собственном коде.Ниже код теперь будет искать значение в первом аргументе (
Search
, может быть "" текстом/String
или одной ячейкой/Range
) против всех значений во втором аргументе (Source
ARange
, состоящем либо из одной, либо из нескольких ячеек).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