Получить одно из определенных слов из текстовой строки. Эксель 2016+

У меня есть список слов, которые мне нужно получить из текстовой строки:

  • Корова
  • Собака-мальчик
  • Привет-получи это

(просто случайные слова)

У меня есть несколько ячеек со случайными словами, окружающими нужные:

  • Случайные слова Корова askjdhakj
  • sla;alsj Мальчик-собака l;sasla
  • skla Здравствуйте! ksalksajsa

И мне нужна функция excel для извлечения указанных слов из этой ячейки. Проблема в том, что мне нужна 1 универсальная формула, которая проверяет все слова в строке и возвращает, если что-то соответствует одному из слов в списке.

Я бы использовал следующую функцию для извлечения одного слова из 1 ячейки:

=TRIM(MID(D4,SEARCH(R3,D4),LEN(R3)))

Где D4 — это текстовая строка, которую мне нужно проверить, а R3 — это слово, которое я ищу.

Я пытался объединить те, которые используют формулу IFS:

=TRIM(IFS($R$4=MID(D2,SEARCH($R$4,D2),LEN($R$4)),$R$4,$R$2=MID(D2,SEARCH($R$2,D2),LEN($R$2)),$R$2))

Но, как некоторые из вас уже поняли, она возвращает ошибку #ЗНАЧ!, потому что, когда первая формула ПОИСК запускается и не находит совпадений, она возвращает ошибку #ЗНАЧ! и все. функция возвращает его, несмотря на то, что на самом деле она может иметь 1 результат TRUE.

Я много гуглил и, как я понимаю, мне нужно использовать формулу ТРАНСП, чтобы создать массив, и каким-то образом получить оттуда результат, но, видимо, я еще не такой умный.

Был бы признателен за помощь в этом. Благодарю вас!


person Sergei Frolov    schedule 07.01.2020    source источник
comment
Будьте осторожны, подстроки, содержащие слово из вашего списка, могут быть включены, возвращая ложные срабатывания. Например. Джек в Джеки... И т.д. и т.д. Я бы порекомендовал использовать регулярные выражения и построить UDF, чтобы вернуть все найденные слова из вашего списка.   -  person JvdV    schedule 07.01.2020


Ответы (2)


Если в столбце A содержатся ячейки со случайными словами с нужными, а в столбце C перечислены нужные, вы можете использовать:

=LOOKUP(2^15,SEARCH($C$1:$C$3,A1,1),$C$1:$C$3)

И копируй вниз. Отрегулируйте диапазон $C$1:$C$3 в соответствии с вашим фактическим диапазоном.

Изменить Объяснение, как показано ниже.

Я не знаю происхождения этой формулы. С этой конструкцией я впервые столкнулся на MrExcel, где ее выложил "Аладин Акюрек".

Часть 2 ^ 15 вычисляется до 32768, что больше (всего на одно число), чем максимальное количество символов, которое теоретически может содержать ячейка Excel, то есть 32767. Оно было опубликовано где-то пользователем с именем «XOR LX», и я использовал его с тех пор .

В конструкции используется способность функции LOOKUP работать с массивами и ошибками, что обеспечивает довольно простое решение.

person shrivallabha.redij    schedule 07.01.2020
comment
Этот тоже помог, спасибо! Не могли бы вы также уточнить, что означает 15 ^ 2 в вашей формуле? - person Sergei Frolov; 07.01.2020
comment
@SergeiFrolov Я отредактировал свой ответ, включив объяснение. - person shrivallabha.redij; 08.01.2020

Используйте ИНДЕКС/АГРЕГАТ:

=INDEX(A:A,AGGREGATE(15,7,ROW($A$1:$A$3)/(ISNUMBER(SEARCH($A$1:$A$3,C1))),1))

введите здесь описание изображения

для тебя:

=INDEX(R:R,AGGREGATE(15,7,ROW($R$2:$R$4)/(ISNUMBER(SEARCH($R$2:$R$4,D4))),1))
person Scott Craner    schedule 07.01.2020
comment
Вау, это было быстро. Это так просто и я просто тупица? :D В любом случае, не могли бы вы уточнить, что означает число 15,7. Где вы их взяли? - person Sergei Frolov; 07.01.2020
comment
15 возвращает первое совпадение, а 7 игнорирует ошибки. @SergeiFrolov - person Scott Craner; 07.01.2020
comment
Опять же, ОП должен заявить, что им нужна эта точность. Я просто отвечаю на вопрос как есть. @JvdV - person Scott Craner; 07.01.2020
comment
@JvdV Да, я это вижу. На самом деле, в текстовых строках не будет других слов, поэтому эти 2 будут выполнять нужную мне работу должным образом. RegEx не вариант, так как это macOS excel, который у меня есть на работе, а VBA очень медленный на macOS excel, когда дело доходит до больших данных. Но и за совет спасибо! - person Sergei Frolov; 07.01.2020