Формула для поиска 3 слов «текст» в любой последовательности в другой ячейке - PullRequest
0 голосов
/ 23 мая 2018

Пожалуйста, посмотрите на прикрепленное изображение.У меня длинный список товаров, и я создал общие ключевые слова для поиска в этом списке.Я использую эту формулу:

=INDEX(A:A,MATCH((("*"&B2&"*")&("*"&C2&"*")&("*"&D2&"*")&("*"&E2&"*")&("*"&F2&"*")),A:A,0))

Проблема в том, что поиск проходит по той же последовательности, что и я.Это дает ошибку, если последовательность слов в ячейке отличается от последовательности в моей формуле, что имеет смысл.

Есть ли способ, которым я могу найти 3 или более слов, которые существуют в любой ячейке в любойпоследовательность?

Я открыт для использования VBA при необходимости.

Результаты моего поиска:

my search results

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Да, для одной ячейки возможно вернуть три подходящих слова из другой ячейки.Ответ в этом примере использует формулу для возврата 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, это двойной пробел

enter image description here

Теперь, чтобы объяснить, как это работает

ПОИСК (поиск что ?, поиск где?) Это ответственно за определение, существует ли совпадение или нет.Если вы понимаете, что такое именованные диапазоны, вы уже выяснили синтаксис.Расположение первой буквы совпадения в 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.

Есть вопросы?

Хорошо, класс отклонен!

0 голосов
/ 23 мая 2018

Вот пользовательская функция:

Public Function indexMX(rng As Range, pat1 As Range, pat2 As Range, pat3 As Range, pat4 As Range, pat5 As Range) As Variant
    Dim r As Range, rngx As Range, s(1 To 5) As String, Kount As Long, j As Long

    s(1) = pat1.Value
    s(2) = pat2.Value
    s(3) = pat3.Value
    s(4) = pat4.Value
    s(5) = pat5.Value

    Set rngx = Intersect(rng, rng.Parent.UsedRange)

    For Each r In rngx
        v = r.Value
        Kount = 0
        For j = 1 To 5
            If InStr(1, v, s(j)) > 0 Or s(j) = "" Then Kount = Kount + 1
        Next j
        If Kount = 5 Then
            indexMX = v
            Exit Function
        End If
    Next r
    indexMX = "no luck"
End Function

Вот пример ее использования:

enter image description here

Как вывидите, мы даем UDF () адрес столбца и адреса пяти ключевых слов, и UDF () находит первый элемент, содержащий все пять слов.

Если ключевое слово пустое, оно не используется, (поэтому, если вы хотите искать только два ключевых слова, оставьте остальные три пустыми) .Если совпадений не найдено, возвращается фраза no luck .

Пользовательские функции (UDF) очень просты в установке и использовании:

  1. ALT-F11 открывает окно VBE
  2. ALT-I ALT-M открывает новый модуль
  3. , вставляет содержимое и закрывает окно VBE

Если вы сохраните книгу, UDF будет сохранен вместе с ней.Если вы используете версию Excel более поздней, чем в 2003 году, вы должны сохранить файл как .xlsm, а не .xlsx

. Чтобы удалить UDF:

  1. , откройте окно VBE каквыше
  2. очистить код
  3. закрыть окно VBE

Для использования UDF из Excel:

= myfunction (A1)

Чтобы узнать больше о макросах в целом, см .:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

и

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

и подробности о UDF, см .:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

Для работы должны быть включены макросы!

РЕДАКТИРОВАТЬ # 1:

для удаления чувствительности к регистру, заменить:

If InStr(1, v, s(j)) > 0 Or s(j) = "" Then Kount = Kount + 1

на:

If InStr(1, LCase(v), LCase(s(j))) > 0 Or s(j) = "" Then Kount = Kount + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...