Не могли бы вы помочь мне понять, почему ВПР с подстановочными знаками не работает? Я гуглил часами и перепробовал все.
С использованием:
=VLOOKUP("*"& E2 &"*",$H$2:$I$3,2,0)
Это работает, когда E2 (ячейка поиска) точно соответствует ключевому слову, но не иначе.
Пример Excel
Образец:
Ваша логика неверна. Ваша формула ищет содержимое E2
в диапазоне H2:H3
. Вам нужно прочитать о том, как работают подстановочные знаки.
Я использовал этот Markdown_Table_Generator согласно Stackoverflow, изображения не подходят для пользователей, пытающихся публиковать решения. Вы можете использовать упомянутую ссылку, она проста в использовании. Вам просто нужно скопировать данные из Excel и вставить на веб-сайт, нажать «Отправить», чтобы создать копию, и вставить в свой ОП. Надеюсь, поможет.!
Кроме того, ваша функция VLOOKUP()
не работает, потому что искомое значение представляет собой строку слов, а ключевые слова здесь — одно слово. это должно было работать наоборот, используя подстановочный знак. Я пытаюсь сказать, что если бы вы использовали это =VLOOKUP("*"&H2&"*",$E$2:$F$4,2,0)
в ячейке J2
для возврата суммы, то это сработало бы. Я знаю, что это не то, что вам нужно, но это пример, который поможет вам понять, как VLOOKUP()
с подстановочным знаком Asterix
работает в Excel
Вместо использования VLOOKUP()
лучше использовать функцию XLOOKUP()
в контексте поиска по соответствующим ключевым словам и возврата соответствующих поставщиков:
=XLOOKUP(1,1-ISERR(SEARCH($H$2:$H$3,E2)),I$2:I$3,"Not Found")
И если вы собираетесь использовать только VLOOKUP()
, попробуйте использовать следующее:
=IFERROR(TOCOL(VLOOKUP(TEXTSPLIT(E2," "),$H$2:$I$3,2,0),2),"Not Found")
Или, используя функцию LOOKUP()
:
=IFERROR(LOOKUP(2,1/(SEARCH($H$2:$H$3,E2)),$I$2:$I$3),"Not Found")
Или можно использовать следующее, но оно будет пустым, если ничего не найдено:
=TEXTJOIN("",1,IF(ISNUMBER(SEARCH($H$2:$H$3,E2)),$I$2:$I$3,""))
Обратите внимание, что я использовал 1-ISERR()
, что эквивалентно ISNUMBER()
, вы также можете использовать ISNUMBER()
вместо первого!
Еще одна вещь: лучше добавить границы до и после ключевого слова:
=XLOOKUP(TRUE,ISNUMBER(SEARCH(" "&$H$2:$H$3&" "," "&E2&" ")),I$2:I$3,"Not Found")
Функция XLOOKUP()
не нуждается в других функциях, если нет совпадения, возвращающего Not Found
!
Спасибо вам большое за это. Вопрос: Подходит ли один из них лучше всего для подстановочных знаков внутри слов, а не просто для полного слова с пробелами по обе стороны? Например, если у меня есть «электрическая компания» и «электрическая компания»?
Привет @brando, ни одно из решений, опубликованных выше кем-либо из нас, не будет работать, поскольку это совершенно другое. Что мы можем сделать, так это SUBSTITUTE()
ввести символ с пробелом. Попробуйте использовать это сейчас: =XLOOKUP(TRUE,ISNUMBER(SEARCH(" "&$H$2:$H$4&" "," "&SUBSTITUTE(E2,"-"," ")&" ")),I$2:I$4,"Not Found")
Вместо VLOOKUP
предлагаю использовать INDEX(...,MATCH(...
=INDEX($M$2:$M$3,MATCH(TRUE,ISNUMBER(SEARCH($L$2:$L$3,E2)),0))
Вы можете использовать инструмент оценки формул, чтобы следовать логике.
(Немного многословная альтернатива, похожая на версию Рона)
Предполагая, что у вас есть Microsoft 365, мы могли бы использовать функцию рекурсивного сопоставления.
Предостережение: из-за текущих ограничений этот метод будет работать, только если таблица поиска содержит 341 строку или меньше (=QUOTIENT(1024, 2 parameters + 1)
.
Для удобства определите значения поиска в виде таблицы . Здесь я назвал это как Vendor_Lookup
Вы можете ввести ключевые слова с подстановочными знаками (?
и *
) — например, для электрической компании в примере.
Введите функцию сопоставления , здесь она называется find_first
, так как она найдет первое совпадение.
find_first
.=LAMBDA(lookup_table,text, IF(ISNUMBER(SEARCH(TAKE(lookup_table, 1, 1), text)), TAKE(lookup_table, 1, -1), IF(ROWS(lookup_table) = 1, "Not found", find_first(DROP(lookup_table, 1), text))))
В первой ячейке столбца «Поставщик» введите следующее, указав весь диапазон для описания:
=find_first(Vendor_Lookup,E2:E5)
Вот функция в развернутом виде:
TAKE(lookup_table, 1, 1)
— это искомое значение, а TAKE(lookup_table, 1, -1)
— возвращаемое значение.
Функция TAKE - Служба поддержки Microsoft
=LAMBDA(lookup_table, text,
IF(
ISNUMBER(SEARCH(TAKE(lookup_table, 1, 1), text)),
TAKE(lookup_table, 1, -1),
IF(
ROWS(lookup_table) = 1,
"Not found",
find_first(DROP(lookup_table, 1), text)
)
)
)
Добавьте функцию find_all_matches
в Диспетчер имен аналогично описанному выше:
Неформатированная версия
=LAMBDA(lookup_table,text, LET(match_1, LAMBDA(row_, LET(pos, SEARCH(TAKE(row_, 1, 1), text), IF(ISNUMBER(pos), TAKE(row_, 1, -1), pos))), matches, BYROW(lookup_table, match_1), errors_removed, TOCOL(matches, 2), joined, TEXTJOIN(" OR ", , errors_removed), result, IFERROR(joined, "Not found"), result))
=LAMBDA(lookup_table, text,
LET(
match_1, LAMBDA(row_,
LET(
pos, SEARCH(TAKE(row_, 1, 1), text),
IF(ISNUMBER(pos), TAKE(row_, 1, -1), pos)
)
),
matches, BYROW(lookup_table, match_1),
errors_removed, TOCOL(matches, 2),
joined, TEXTJOIN(" OR ", , errors_removed),
result, IFERROR(joined, "Not found"),
result
)
)
Хммм, когда я вставил это, звездочки не показывались. Итак, выше… это цитата, затем звездочка, затем цитата.