Excel как найти все строки, соответствующие элементам из списка, разделенного запятыми, без VBA

#arrays #excel #excel-formula

#массивы #excel #excel-формула

Вопрос:

Вот моя проблема, у меня есть таблица с двумя столбцами: ссылки на продукты и соответствующие идентификаторы уведомлений:

  | A       | B      | C      | D      |
---------------------------------------
1| Product | Notice |        |        |
2| p1      | n1     |        |        |
3| p2      | n2     |        |        |
4| p3      | n3     |        |        |
5|         |        |        |        |
6|         |        | p1, p3 | =...   |
  

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

Скажем, в другой ячейке (например, C6) у меня есть разделенный запятыми список ссылок на продукты, p1, p3 и мне нужна формула для вывода соответствующих идентификаторов уведомлений, т.Е. n1, n3 в данном случае, в ячейке D6.

Важно: По разным причинам я не могу использовать VBA, мне нужна стандартная формула массива Excel.

Вот что я могу сделать на данный момент:

  1. с помощью FILTERXML функции я могу разделить список, разделенный запятыми, на массив: FILTERXML("<t><s>" amp; SUBSTITUTE(C6, ", ", "</s><s>") amp; "</s></t>", "//s")

  2. с помощью TEXTJOIN функции я могу объединить массив в строку.

  3. Я могу извлечь единственное совпадение с помощью комбинации функций INDEX и MATCH , например:

 =IF(ISERROR(MATCH("p3"; A:A; 0)); "not found"; INDEX(B:B; MATCH("p3"; A:A; 0)))
  

(что для меня бесполезно, поскольку ссылки в столбце A снова уникальны)

(Кстати, я не знаю, есть ли лучший способ обработать ошибку, вызванную MATCH , когда совпадение не найдено)

  1. Я могу извлечь и объединить элементы столбца B, соответствующие нескольким совпадениям, с одной ссылкой в столбце A с помощью (формула массива активируется с помощью Ctrl Shift Enter):
 {=TEXTJOIN(", "; TRUE; IF(A:A="p2"; B:B; ""))}
  

(что для меня бесполезно, поскольку ссылки в столбце A снова уникальны)

Вкратце: я могу найти и объединить несколько совпадений с одной ссылкой, но я не могу найти и объединить одно уникальное совпадение с несколькими ссылками (что я хочу сделать).


Неудачные попытки

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

  • Объединение 1, 2 и 4 (с использованием OR логического массива совпадений):
 {=TEXTJOIN(", "; TRUE; IF(OR(A:A=FILTERXML("<t><s>" amp; SUBSTITUTE(C6, ", ", "</s><s>") amp; "</s></t>", "//s")); B:B; ""))}
  

или (используя SUM для логического массива совпадений):

 {=TEXTJOIN(", "; TRUE; IF(SUM(A:A=FILTERXML("<t><s>" amp; SUBSTITUTE(C6, ", ", "</s><s>") amp; "</s></t>", "//s")); B:B; ""))}
  

Здесь я не уверен, как обрабатывать различные массивы, которые рассматриваются в IF (столбец A и список ссылок, приведенный FILTERXML ).).

  • Объединение 1, 2 и 3:
 {=TEXTJOIN(", "; TRUE; INDEX(B:B; MATCH(FILTERXML("<t><s>" amp; SUBSTITUTE(C6, ", ", "</s><s>") amp; "</s></t>", "//s"); A:A; 0)))}
  

Здесь я не уверен, как обрабатывать (i) снова рассмотренные различные массивы (столбец A и список ссылок, заданный FILTERXML ), (ii) ошибку, вызванную MATCH , когда совпадение не найдено, (iii) ссылки на массив, переданные INDEX функции.

Ответ №1:

Хороший вопрос. Если у вас просто Excel 2019, возможно, вы могли бы использовать:

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

Формула в E1 :

 =TEXTJOIN(", ",,IFERROR(VLOOKUP(FILTERXML("<t><s>"amp;SUBSTITUTE(D1,", ","</s><s>")amp;"</s></t>","//s"),A:B,2,FALSE),""))
  

Если у вас есть Excel O365, то, возможно:

 =TEXTJOIN(", ",,XLOOKUP(FILTERXML("<t><s>"amp;SUBSTITUTE(D1,", ","</s><s>")amp;"</s></t>","//s"),A:A,B:B,"",0))
  

Комментарии:

1. Спасибо! У меня Excel 2016, это проблема? И у меня есть другая проблема, в реальном файле столбцы A и B не расположены рядом, поэтому я не уверен, что могу использовать VLOOKUP , я прав?

2. @Odin, вам понадобится доступ к TEXTJOIN , который, судя по вашему вопросу, у вас был. Значит, у вас есть Excel 2019? Кстати, если вы настроены на использование INDEX и MATCH , вы могли бы попробовать: =TEXTJOIN(", ",,IFERROR(INDEX(A:A,MATCH(FILTERXML("<t><s>"amp;SUBSTITUTE(D1,", ","</s><s>")amp;"</s></t>","//s"),A:A,0)),""))

3. Я определил пользовательскую функцию, переопределяющую TEXTJOIN ( get-digital-help.com/textjoin-function ) это единственный VBA, который я позволил себе.

4. Но если у вас есть UDF, вы, по сути, используете VBA. Как насчет UDF, который просто делает именно то, что вам нужно тогда?

5. Поскольку я не буду поддерживать это, поэтому мне нужна строгая формула (для людей, которые будут ее поддерживать). TEXTJOIN Исключение является временным (и простым) исправлением, пока версия Excel не будет обновлена и не будет доступна соответствующая TEXTJOIN функция.

Ответ №2:

Попробуйте:

 =TEXTJOIN(",",TRUE,VLOOKUP(FILTERXML("<t><s>" amp; SUBSTITUTE(C6,",","</s><s>")amp;"</s></t>","//s"),tblProd[[Product]:[Notice]],COLUMNS(tblProd[[Product]:[Notice]]),FALSE))
  

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

Поскольку вы не знали расстояние между Product столбцом и Notice колонкой, я построил массив и получил Column Number аргумент для VLOOKUP использования COLUMNS функции

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

Комментарии:

1. Какую версию Excel вы используете? Я не могу воспроизвести это. Я читал, что VLOOKUP не может управлять значениями поиска в массиве, возможно, это проблема версии Excel. Спасибо

2. @Odin В чем проблема у вас с этим? Я не знаю об этом VLOOKUP ограничении в Excel 2016.