Использование Excel для VLOOKUP и WildCard не работает

Не могли бы вы помочь мне понять, почему ВПР с подстановочными знаками не работает? Я гуглил часами и перепробовал все.

С использованием:

=VLOOKUP("*"& E2 &"*",$H$2:$I$3,2,0)

Это работает, когда E2 (ячейка поиска) точно соответствует ключевому слову, но не иначе.

Пример Excel

Использование Excel для VLOOKUP и WildCard не работает

Образец:

Дата Теги Субкат Продавец Описание Количество 04.03.2019 Еда Продукты питания Ханнафорд Маркет TST* HANNAFORD DBT CRD 0000 03.03.19 22167640 C#5055  170,00 долларов США 04.03.2019 Еда Ужин вне дома Не найдено TST* PRICE CHOP DBT CRD 0000 03.03.19 22167640 #5055  $40,09 04.03.2019 Еда Ужин вне дома Пиццерия Даунтаун ПИЦЦЕРИЯ DO DBT CRD 0000 02.03.19 161146526 C#5055  $ 86,32
Ключевые слова Продавец Ханнафорд Ханнафорд Маркет пиццерия Пиццерия Даунтаун

Хммм, когда я вставил это, звездочки не показывались. Итак, выше… это цитата, затем звездочка, затем цитата.

brando 24.06.2024 00:56

Ваша логика неверна. Ваша формула ищет содержимое E2 в диапазоне H2:H3. Вам нужно прочитать о том, как работают подстановочные знаки.

Ron Rosenfeld 24.06.2024 01:01

Я использовал этот Markdown_Table_Generator согласно Stackoverflow, изображения не подходят для пользователей, пытающихся публиковать решения. Вы можете использовать упомянутую ссылку, она проста в использовании. Вам просто нужно скопировать данные из Excel и вставить на веб-сайт, нажать «Отправить», чтобы создать копию, и вставить в свой ОП. Надеюсь, поможет.!

Mayukh Bhattacharya 24.06.2024 01:22

Кроме того, ваша функция VLOOKUP() не работает, потому что искомое значение представляет собой строку слов, а ключевые слова здесь — одно слово. это должно было работать наоборот, используя подстановочный знак. Я пытаюсь сказать, что если бы вы использовали это =VLOOKUP("*"&H2&"*",$E$2:$F$4,2,0) в ячейке J2 для возврата суммы, то это сработало бы. Я знаю, что это не то, что вам нужно, но это пример, который поможет вам понять, как VLOOKUP() с подстановочным знаком Asterix работает в Excel

Mayukh Bhattacharya 24.06.2024 01:25
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
104
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вместо использования 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 25.06.2024 14:24

Привет @brando, ни одно из решений, опубликованных выше кем-либо из нас, не будет работать, поскольку это совершенно другое. Что мы можем сделать, так это SUBSTITUTE() ввести символ с пробелом. Попробуйте использовать это сейчас: =XLOOKUP(TRUE,ISNUMBER(SEARCH(" "&$H$2:$H$4&" "," "&SUBSTITUTE(E2,"-"," ")&" ")),I$2:I$4,"Not Found")

Mayukh Bhattacharya 25.06.2024 15:20

Вместо 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).

  1. Для удобства определите значения поиска в виде таблицы . Здесь я назвал это как Vendor_Lookup

    Вы можете ввести ключевые слова с подстановочными знаками (? и *) — например, для электрической компании в примере.

  2. Введите функцию сопоставления , здесь она называется find_first, так как она найдет первое совпадение.

    1. В Менеджере имен введите новый элемент с именем find_first.
    2. Введите следующее в качестве ссылки: =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))))
  3. В первой ячейке столбца «Поставщик» введите следующее, указав весь диапазон для описания:

    =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
    )
)

Другие вопросы по теме