
Estou tentando pegar uma lista de produtos e extrair o fabricante do início do nome do produto. Cada nome de produto começa com seu fabricante. Isso é complicado pelo fato de alguns itens terem outros fabricantes no corpo do nome; Preciso ver com o que o item começa. Estou lidando com mais de 50.000 itens e mais de 3.000 fabricantes. A fórmula que tenho até agora é:
=LOOKUP(1,1/(FIND($C$2:$C$5,B2)),$C$2:$C$5)
Isso funciona algumas vezes, mas não outras. Por exemplo, na planilha abaixo, as linhas 2 e 3 estão corretas, mas a linha 4 não. O resultado na célula A4
para “Mike's Fun Toys” (na célula B4
) deveria ser “Mike's”, mas aparece como “Fun”.
(Aqui estão os dados em formato de texto que você pode copiar e colar:
+---+---------+-----------------+---------------+
| | 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 |
+---+---------+-----------------+---------------+
)
Mas quando mudo a ordem da Coluna C
(Fabricantes):
a linha 4 fica correta (“de Mike”), mas a linha 2 dá errado.
A coluna A tem a fórmula inteira. Resultados esperados:
A2 - Brown
A3 - Cat
A4 - Mike's
Como posso fazer a fórmula funcionar independentemente da ordem de Column C
?
Responder1
Para o benefício dos leitores que não entendem a fórmula de RyanMark, é
- Encontrar a posição de cada um dos nomes dos fabricantes em um determinado nome de produto. Isto resulta em
- um valor de
1
para o nome do fabricante que inicia o nome do produto (porque aparece no1primeiro personagem), - números mais altos para nomes de outros fabricantes que aparecem no nome do produto (porque aparecem mais tarde, em números de posição mais altos), e
- um
#VALUE!
código de erro para nomes de fabricantes que não aparecem no nome do produto.
- um valor de
- Invertendo cada um dos itens acima (dividindo 1 por ele), resultando em
1
para o nome do fabricante que inicia o nome do produto (que é aquele que queremos encontrar),- números positivos mais baixos para nomes de outros fabricantes que aparecem no nome do produto (porque 1 dividido por um número maior que 1 produz uma proporção menor que 1) e
- um
#VALUE!
código de erro para nomes de fabricantes que não aparecem no nome do produto.
- Usando
LOOKUP
para encontrar o1
acima.
Por exemplo, para cell A4
(correspondente a “Mike's Fun Toys” em cell B4
), na primeira imagem, obtemos, em ordem,
1
, porque “Mike's” (C2
) começa com “Mike's Fun Toys”,8
, porque “Fun” (C3
) aparece no 8º personagem de “Mike's Fun Toys”, e#VALUE!
e#VALUE!
, porque “Cat” (C4
) e “Brown” (C5
) não aparecem em “Mike's Fun Toys”.
Inverter isso resulta em 1
, 0.125
( 1/8
) #VALUE!
e #VALUE!
. Então ele procura o 1
nesse array. Este “deveria” funcionar, porque 1
é o primeiro resultado, e “Mike” é o primeiro nome em Column C
.
O problema pode ser visto na página de ajuda para LOOKUP
:
Para oOLHO PARA CIMApara que a função funcione corretamente, os dados consultados deverão ser ordenados em ordem crescente.
e claramente 1
seguido por 0.125
não está classificado em ordem crescente.
Como LOOKUP
sugere, podemos resolver isso usando MATCH
. A fórmula que você deseja, que usa a mesma abordagem básica da sua fórmula (exceto sem a inversão, que é desnecessária), é
=INDEX($C$2:$C$5, MATCH(1, FIND($C$2:$C$5,$B2), 0))
O terceiro argumento MATCH
é chamado “match_type”. Eu configurei 0
aqui, o que significa que MATCH
procurará o primeiro elemento na matriz que é exatamente 1
e não assumirá que a matriz está classificada.
Esta é uma fórmula de matriz, então você deve pressionar Ctrl+ Shift+ Enter ao inseri-la.