Измените формулу на «Поиск» по следующему имени, если первое имя в списке приводит к # N / A - PullRequest
0 голосов
/ 11 октября 2019

Я использую эту формулу, которая отлично работает для первого имени в ячейке. Я хотел бы обновить формулу до «Поиск» по следующему имени и сделать Vlookup, если первое имя в списке приводит к # N / A.

  • Первая строка содержит: Jane; John; David;
  • Вторая строка содержит: Mary; Molly; Dan; Thomas;
  • Третья строка содержит: Lily; Dove; Lucy; Mike;

=VLOOKUP(LEFT(F86, SEARCH(";",F86,1)-1),UserDepReport!A:R,3,FALSE)

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Предположим, у вас есть следующие именованные диапазоны :

  • ListName , являющийся столбцом A вашего листа UserDepReport;
  • ListValue - это столбец C вашего UserDepReport листа.

Попробуйте одну из следующих формул массива , которую вы ДОЛЖНЫ нажмете Ctrl + Shift + Введите после завершения формулы в строке формул, иначе они будут работать неправильно. Затем вы можете просто перетащить формулу вниз, чтобы применить ее.

=INDEX(ListValue,MATCH(TRIM(MID(SUBSTITUTE(MID(D2,MIN(IFERROR(SEARCH("; "&ListName&";","; "&D2),LEN(D2))),LEN(D2)),";",REPT(" ",100)),1,100)),ListName,0))

Замените D2 в соответствии с вашим реальным случаем.

Логика заключается в использовании SEARCH *Функция 1035 *, чтобы выяснить, присутствует ли в строке любое из имен из вашей таблицы данных, затем используйте функции MIN + IFERROR , чтобы вернуть первое присутствие действительного имени, затем используйте TRIM +Функции MID + REPT для извлечения имени и, наконец, использования INDEX + MATCH для возврата соответствующего значения.

или

=INDEX(ListValue,MATCH(TRIM(MID(SUBSTITUTE(D2,";",REPT(" ",100)),(MIN(IFERROR(MATCH(ListName,FILTERXML("<t><s>"&TRIM(SUBSTITUTE(LEFT(D2,LEN(D2)-1),";","</s><s>"))&"</s></t>","t/s"),0),LEN(D2)))-1)*100,100)),ListName,0))

ЗаменитьD2 в соответствии с вашим фактическим регистром.

Логика этой формулы аналогична первой, в то время как эта используется FILTERXML для извлечения всех имен в строке вмассив, затем используйте функцию MATCH , чтобы выяснить, присутствует ли в строке любое из имен вашей таблицы данных, затем используйте функции MIN + IFERROR , чтобы вернуть первое присутствиедопустимое имя, а остальное такое же, как у первой функции.

Solution

Дайте мне знать, если у вас есть какие-либо вопросы. Ура :) 1066 *

0 голосов
/ 11 октября 2019

Вам нужно будет перебрать имена и проверить каждое из них, затем вернуть массив положительных находок в индекс, чтобы вернуть массив ответов, а затем выбрать первое. Используйте эту формулу массива:

=INDEX(INDEX(E:E,N(IF({1},MODE.MULT(IF(ISNUMBER(MATCH(TRIM(MID(SUBSTITUTE(A1,";",REPT(" ",999)),(ROW($ZZ$1:INDEX($ZZ:$ZZ,LEN(A1)-LEN(SUBSTITUTE(A1,";",""))))-1)*999+1,999)),D:D,0)),MATCH(TRIM(MID(SUBSTITUTE(A1,";",REPT(" ",999)),(ROW($ZZ$1:INDEX($ZZ:$ZZ,LEN(A1)-LEN(SUBSTITUTE(A1,";",""))))-1)*999+1,999)),D:D,0)*{1,1}))))),1)

Будучи формулой массива, она должна быть подтверждена с помощью Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования.

Возвращает первое совпадение на основепорядок в A1.

enter image description here

Если прецедентом порядка был список имен (столбец D на моей фотографии), можно использовать более простую формулу:

=INDEX(E:E,AGGREGATE(15,7,ROW($D$1:$D$5)/(ISNUMBER(SEARCH("; "&$D$1:$D$5&";","; " &A1))),1))

Обратите внимание на различную доходность между B3 и C3:

enter image description here


Мы также можем использовать vba.Split() спростой UDF:

Function MYSPLIT(STR As String, del As String) As String()
    MYSPLIT = Split(STR, del)
End Function

Это позволяет использовать более короткую формулу:

=INDEX(INDEX(E:E,N(IF({1},MODE.MULT(IF(ISNUMBER(MATCH(TRIM(MYSPLIT(A1,";")),D:D,0)),MATCH(TRIM(MYSPLIT(A1,";")),D:D,0)*{1;1}))))),1)

Тем не менее формула массива, которая должна использовать Ctrl-Shift-Enter. Поместите код в модуль, прикрепленный к книге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...