Да, для одной ячейки возможно вернуть три подходящих слова из другой ячейки.Ответ в этом примере использует формулу для возврата 6 совпадений.Функции VBA и специальные массивы не используются.
Это формула:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUMPRODUCT((IFERROR(SEARCH(FIRST,TARGET),0)>0)*100000+(IFERROR(SEARCH(SECOND,TARGET),0)>0)*20000+(IFERROR(SEARCH(THIRD,TARGET),0)>0)*3000+(IFERROR(SEARCH(FOURTH,TARGET),0)>0)*400+(IFERROR(SEARCH(FIFTH,TARGET),0)>0)*50+(IFERROR(SEARCH(SIXTH,TARGET),0)>0)*6),"1",FIRST&DELIM),"2",SECOND&DELIM),"3",THIRD&DELIM),"4",FOURTH&DELIM),"5",FIFTH&DELIM),"6",SIXTH&DELIM),"0","")
Заметили ли вы названные диапазоны?ПЕРВАЯ, ВТОРАЯ, ТРЕТЬЯ и т. Д. - это отдельные ячейки, в каждой из которых содержится словоМы пытаемся найти эти слова внутри TARGET.Если мы найдем слова, то мы напишем их в этой ячейке, содержащей эту формулу, и каждое слово будет разделено DELIM
. Диапазоны являются необязательными.На картинке ниже вы увидите, что ячейка A2 содержит слово «named».Это первое из шести слов, которые мы пытаемся найти, и оно может быть выражено как FIRST = "A2" = "named". В формуле вы увидите, что FIRST появляется дважды.Вы можете заменить его на «named», и ячейка A2 станет пустой, но функциональность формулы не изменится.
Даже TARGET является необязательным.Он может быть записан как E1 или напечатан дословно.Я не знаю, почему кто-то сделал бы это ... но это возможно.
DELIM находится в ячейке B2, это двойной пробел
Теперь, чтобы объяснить, как это работает
ПОИСК (поиск что ?, поиск где?) Это ответственно за определение, существует ли совпадение или нет.Если вы понимаете, что такое именованные диапазоны, вы уже выяснили синтаксис.Расположение первой буквы совпадения в TARGET возвращается.В этой формуле оно всегда равно 1. Если оно не найдено, то число равно 0
IFERROR (значение, значение) пытается выполнить операцию.В случае успеха, результат отображается.В случае ошибки отображается второй результат.Каждый IFERROR в этой формуле практически одинаков: IFERROR(SEARCH(FIRST,TARGET),0)
Он ищет в TARGET, пытаясь найти первое слово.Результат, если найдено 1 и если не найден 0
Отсюда все немного сложнее, поэтому давайте подведем итоги.Мы звоним ПОИСК 6 раз.Один раз для каждого слова, которое мы хотим найти, и мы всегда ищем в TARGET.Результатом будет 1, если совпадение найдено, или 0, если нет.По иронии судьбы, мы, люди, можем собрать это вместе и увидеть совпадение, но формула не может определить, какие слова были сопоставлены без дополнительной информации
SUMPRODUCT принимает сумму (сложение) произведения (умножение) двух или болеемассивы.
умножьте два массива, чтобы получить продукт a, b, c * e, f, g = ae, bf, cg
takethe sum of the product to get the SUMPRODUCT
ae + bf + cg`
Это проще всего, если подумать о цене и количестве.Если один массив является ценой группы товаров, а другой - количеством одной и той же группы товаров, то умножение двух массивов создаст новый массив, где каждый элемент - это стоимость покупки всех предметов этого типа в группе.итого, и сложение всех этих чисел дает вам общую стоимость, которую вы заплатите за все элементы
Здесь мы умножаем два массива:
Qty Price
12.0 0.3
70.0 0.1
20.0 0.4
Умножим их, чтобы получить продукт:
Qty Price Total
12.0 0.3 3.8
70.0 0.1 7.0
20.0 0.4 8.0
Возьмите сумму произведения:
Qty Price Total
12.0 0.3 3.8
70.0 0.1 7.0
20.0 0.4 8.0
18.8 SUMPRODUCT
Давайте посмотрим на часть формулы:
SUMPRODUCT ((IFERROR (SEARCH (FIRST, TARGET)),0)> 0) * 100000 + IFERROR (SEARCH (ВТОРАЯ, TARGET), 0)> 0) * 20000 + ...
Легко видеть, что этот сегмент ищет два слова.Мы знаем, что SUMPRODUCT хочет умножить и добавить массивы.Если вы думаете, (IFERROR(SEARCH(FIRST,TARGET),0)>0)
- массив, вы были бы правы!Это не массив в техническом смысле этого слова, но он действительно оценивается как единое значение, которое может рассматриваться как массив 1x1 или как ячейка.Зоркие и сообразительные, возможно, заметили, что в этом массиве мы упомянули что-то.Это неравенство в конце!Многие из вас знают, что вы можете взять числовые значения и превратить их в логические, проверяя их с неравенством.Итак, давайте оценим .... ПОИСК для ПЕРВЫХ внутри TARGET = 1, потому что FIRST = "named", который находится внутри TARGET, waaaaaaay сзади и потому что это не было ошибкой, мы получаем сохранение 1. Далее мы выполняем неравенство 1>0 = ИСТИНА Один больше нуля и оценивается как ИСТИНА
Это то, что мы имеем сейчас
SUMPRODUCT((TRUE*100000+IFERROR(SEARCH(SECOND,TARGET),0)>0)*20000+....
Можете ли вы идентифицировать массивы сейчас?Мы знаем, что TRUE - это массив 1x1.Вы знаете, что бит IFERROR вплоть до неравенства также является массивом.Давайте оценим это ИСПОЛЬЗОВАНИЕ .... Математически мы все равно должны работать слева направо, но поверьте мне, мы в порядке, если мы позволим этому скользить один раз.
IFERROR(SEARCH(SECOND,TARGET),0)>0) SECOND = "array" = 1 = TRUE
Следили ли вы за моей короткой рукой?Это нормально, если вы не просто сделали резервную копию и попрактиковались в FIRST, пока не поняли.
Включение значения дает нам что-то вроде этого
SUMPRODUCT(TRUE*100000+TRUE*20000+...
SUMPRODUCT - это СУММА (дополнение)ПРОДУКТ (умножение) Итак, мы добавляем материал, который мы умножаем
SUMPRODUCT = (TRUE * 100000) + (TRUE * 20000)
Помните, как легко было перейти от 1> 0 к ИСТИНА.Мы «вбираем все в это логическое ИСТИНА», равное 1 Вот забавный факт, -1 также равно ИСТИНА.Если вы когда-либо видели формулу с двойным отрицательным знаком, например, STUFF (- (MORESTUFF (это просто какой-то мастер Excel), который проверяет, что они получают +1 вместо -1 ... хорошо, так что давайте вернемсяна ходу и оценки
SUMPRODCUT = 1 * 100000 + 1 * 20000+....
SUMPRODCUT = 100000 + 20000+....
SUMPRODCUT = 120000+.....
Я знаю, что вы спрашивали об этих числах. Сто тысяч? Зачем сто тысяч? Я целенаправленно игнорировал, пока не стало удобно говорить об этом. Итеперь это удобно. Посмотрите на формулу whoooole, и вы найдете шаблон. Эти числа находятся в убывающей последовательности. Любой, кто когда-либо делал побитовую логику, может видеть, где это происходит. У меня мало времени, поэтому я будупереход к преследованию. Предположим гипотетическую ситуацию, когда каждое слово совпало. Вы бы в конечном итоге получили
SUMPRODUCT = 100000 + 20000 + 3000 + 400 + 50 + 6
SUMPRODCUT = 123456
123456 Вы тянете меня за ногу? Нет, я не. Мы почти закончили, еслиты все еще со мной, тогда ты отвезешь его домой.
У нас есть большая группа учителей ЗАМЕНИТЕЛЕЙ в начале очереди, и мы должны избавиться от них.
У нас также есть это, чтобы бороться с :"1",FIRST&DELIM),"2",SECOND&DELIM),"3",THIRD&DELIM),"4",FOURTH&DELIM),"5",FIFTH&DELIM),"6",SIXTH&DELIM),"0","")
К счастью для нас, они являются частью той же проблемы.Мы пробились из середины.
SUBSTITUTE(SUBSTITUTE(text, old text, new text)
SUBSTITUTE(SUBSTITUTE("123456","1", FIRST & DELIM),"2",SECOND & DELIM)....
Помните, сверху DELIM указывал на ячейку с двойным пробелом.Каждый DELIM может быть заменен на "" или любой другой разделитель, который вы хотите.
SUBSTITUTE(SUBSTITUTE("123456","1", "named" & " "),"2",SECOND & DELIM)...
SUBSTITUTE("named 23456","2",SECOND & DELIM)...
SUBSTITUTE("named 23456","2","array"& " ")...
("named array 3456")... and so on.
Есть вопросы?
Хорошо, класс отклонен!