Функция циклического сопоставления слов в 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) против всех значений во втором аргументе (SourceARange, состоящем либо из одной, либо из нескольких ячеек).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