Я пытаюсь взять список товаров и извлечь их производителя из начала названия товара. Каждое название товара начинается с производителя. Это осложняется тем, что некоторые товары имеют других производителей в тексте названия; мне нужно увидеть, с чего начинается товар. Я имею дело с более чем 50 000 товаров и более чем 3000 производителей. Формула, которую я получил на данный момент, выглядит так:
=LOOKUP(1,1/(FIND($C$2:$C$5,B2)),$C$2:$C$5)
Иногда это работает, иногда нет. Например, в приведенном ниже рабочем листе строки 2 и 3 верны, а строка 4 — нет. Результатом в ячейке A4
для «Mike's Fun Toys» (в ячейке B4
) должно быть «Mike's», но выводится как «Fun».
(Вот данные в текстовом виде, которые вы можете скопировать и вставить:
+---+---------+-----------------+---------------+
| | A | B | C |
+---+---------+-----------------+---------------+
| 1 | Formula | Items | Manufacturers |
+---+---------+-----------------+---------------+
| 2 | Brown | Brown Cat Toys | Mike's |
| 3 | Cat | Cat Fun Toys | Fun |
| 4 | Fun | Mike's Fun Toys | Cat |
| 5 | | | Brown |
+---+---------+-----------------+---------------+
)
Но когда я меняю порядок столбцов C
(Производители):
Строка 4 становится правильной («Майк»), но строка 2 становится неправильной.
В столбце A формула находится от начала до конца. Ожидаемые результаты:
A2 - Brown
A3 - Cat
A4 - Mike's
Как заставить формулу работать независимо от порядка столбцов C
?
решение1
Для читателей, которые не понимают формулу Райана Марка, это
- Поиск позиции каждого из названий производителей в данном названии продукта. Это приводит к
- значение
1
для имени производителя, с которого начинается название продукта (потому что оно появляется в начале)11-й символ), - более высокие номера для названий других производителей, которые появляются в названии продукта (потому что они появляются позже, на более высоких позициях), и
- код
#VALUE!
ошибки для названий производителей, которые не указаны в названии продукта.
- значение
- Инвертируем каждое из вышеприведенных выражений (делим на 1), в результате чего получаем
1
для имени производителя, с которого начинается название продукта (которое мы и хотим найти),- меньшие положительные числа для названий других производителей, которые встречаются в названии продукта (потому что 1, деленная на число, большее 1, дает отношение меньшее 1), и
- код
#VALUE!
ошибки для названий производителей, которые не указаны в названии продукта.
- Используя
LOOKUP
для поиска1
в приведенном выше примере.
Например, для ячейки A4
(соответствующей «Игрушкам Майка» в ячейке B4
), на первом изображении, мы получаем, по порядку,
1
, потому что «Mike's» (C2
) начинается с «Mike's Fun Toys»,8
, потому что «Веселье» (C3
) появляется на 8-м месте в «Игрушках Майка» и#VALUE!
и#VALUE!
, поскольку «Кот» (C4
) и «Коричневый» (C5
) не встречаются в «Забавных игрушках Майка».
Инвертирование, которое приводит к 1
, 0.125
( 1/8
), #VALUE!
и #VALUE!
. Затем он ищет 1
в этом массиве. Это «должно» работать, потому что 1
— первый результат, а «Mike's» — первое имя в столбце C
.
Проблему можно увидеть на странице справки LOOKUP
:
ДляИСКАТЬДля корректной работы функции искомые данные должны быть отсортированы в порядке возрастания.
и явно 1
за которым следует 0.125
не сортируется в порядке возрастания.
Как LOOKUP
предполагает, мы можем решить это с помощью MATCH
. Формула, которую вы хотите получить, которая использует тот же базовый подход, что и ваша формула (за исключением инвертирования, которое не нужно), выглядит так:
=INDEX($C$2:$C$5, MATCH(1, FIND($C$2:$C$5,$B2), 0))
Третий аргумент MATCH
называется «match_type». Я установил его 0
здесь, что означает, что MATCH
будет искать первый элемент в массиве, который точно равен 1
, и не будет предполагать, что массив отсортирован.
Это формула массива, поэтому при ее вводе нужно нажать Ctrl+ Shift+ .Enter