Notifications
Clear all

Como funciona? (Procv Reverso)

16 Posts
3 Usuários
0 Reactions
3,321 Visualizações
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Boa tarde,
Encontrei uma solução elegante para um "Procv Reverso" na internet, porém eu não entendi porque ele funciona e gostaria de entender a mecânica da coisa embora tenha feito funcionar. Além de entender, caso alguém saiba fazer a mesma coisa utilizando fórmulas matriciais seria interessante, pois este era meu objetivo.

No exemplo que coloquei (bem simples) basicamente quero procurar e retornar o nome da pessoa procurando de baixo para cima, isto porque tenho uma relação de CPFs de pessoas que foram atendidas por mais de um Vendedor, então esta procura irá me retornar o último vendedor que atendeu o CPF procurado.

Enfim queria entender a fórmula (que não é matricial) e porque ela funciona. E como seria uma fórmula matricial e o racional dela por trás.

Att, e obrigado pelo seu tempo.
Luis

 
Postado : 18/12/2013 10:32 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

finaljustice,

boa tarde!

1º- a Fórmula usada é =PROC(2;1/(A2:A19=$D2);B2:B19). A Fórmula matricial é a inclusão dos { } no começo e fim da fórmula.
Ao digitar a fórmula, ao invés de dar [ENTER] para inserir uma fórmula matricial se pressionam, simultaneamente, as teclas [CTRL]+[SHIFT]+[ENTER].

2º - Eu não entendi o que você deseja com relação a "procurar de baixo pra cima", uma vez que digitando o número do CPF vai aparecer o nome correspondente ao inserido na coluna B.

Att,

 
Postado : 18/12/2013 10:51 am
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

finaljustice,

boa tarde!

1º- a Fórmula usada é =PROC(2;1/(A2:A19=$D2);B2:B19). A Fórmula matricial é a inclusão dos { } no começo e fim da fórmula.
Ao digitar a fórmula, ao invés de dar [ENTER] para inserir uma fórmula matricial se pressionam, simultaneamente, as teclas [CTRL]+[SHIFT]+[ENTER].

2º - Eu não entendi o que você deseja com relação a "procurar de baixo pra cima", uma vez que digitando o número do CPF vai aparecer o nome correspondente ao inserido na coluna B.

Att,

Boa tarde Marciel, obrigado por responder.

Coloque em uma célula a formula =PROCV($D2;$A$2:$B$19;2;FALSO) na planilha que montei, você irá reparar que o resultado será LUIS e não MAMA como utilizando a =PROC(2;1/(A2:A19=$D2);B2:B19). Foi isto que quis dizer, o procv trás o primeiro resultado da procura de cima para baixo, eu queria o primeiro resultado de baixo para cima. Gostaria de entender como o [Valor_Procurado] = 2 o porque disso, e oqq está sendo feito no [VETOR_PROC] = 1/(A2:A19=$D2).

Eu sei que para "ativar" a fórmula matricial é necessário [CTRL]+[SHIFT]+[ENTER], no caso a fórmula que apresentei não é matricial. Gostaria de uma fórmula matricial (outra solução) que fizesse exatamente a mesma coisa que esta não matricial está fazendo pois não consegui montar uma solução por falta de experiência com fórmulas matriciais.

Ficou mais claro?
Att,
Luis

 
Postado : 18/12/2013 11:21 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ok, vamos lá

=PROC(2;1/(A2:A19=$D2);B2:B19)

Primeiro que aqui, o que é usado é PROC() e não PROCV().
O PROC(): valor procurado, matriz de busca, matriz de resultados.

Quanto a ser ou não ser matricial, o PROC funcionou bem em ambos os casos (ou seja, com Enter ou com Ctrl+Shift+Enter deu o mesmo resultado)

Segundo, este foi um caso interessante onde se aproveitou de uma caractetrística do PROC que pode ser considerada limitação, para atingir o objetivo.
Para que o PROC() funcione, ele precisa necessariamente ter a coluna de busca classificada em ordem crescente. O que no exemplo, não é o caso.
A matriz de busca neste exemplo é uma matriz de comparações do intervalo de CPFs com o conteúdo da célula de busca, porém colocando o "1/" no começo da matriz, tem-se uma matriz de 1s (uns) e de erros de divisão por zero.
O interessante está no valor procurado, que neste caso é 2. que não existe na matriz de busca que deveria ser em ordem crescente. Então, o PROC() por padrão retorna o resultado (da coluna de resultados) do último valor mais próximo do valor procurado, ou seja, do último 1.

Não sei se fui claro, mas vou tentar mostrar passo a passo:

passo a passo:
=PROC(2; 1/(A2:A19=$D2); B2:B19)

distrinchando:
=PROC(2; 1/{VERDADEIRO; FALSO;FALSO;FALSO;FALSO;FALSO;FALSO; FALSO;FALSO;VERDADEIRO;FALSO;FALSO;FALSO; FALSO;VERDADEIRO; FALSO;FALSO;FALSO}; B2:B19)

Essa é uma matriz de verdadeiros e falsos, que pode ser considerada uma matriz de 1s e 0s. No próximo passo, o Excel divide 1 pela matriz.
Resultando:
=PROC(2; {1;#DIV/0!; #DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!; #DIV/0!;#DIV/0!;#DIV/0!;1;#DIV/0!;#DIV/0!;#DIV/0!; #DIV/0!; 1 ; #DIV/0!;#DIV/0!;#DIV/0!}; B2:B19)

Dentro da explicação acima, agora ficou simples:
O PROC() procurou de cima pra baixo, pq ele funciona assim.
Procurou o 2. Na matriz de busca, não existe o 2. Então ele foi até o fim, procurando.
Quando viu que não encontrou, retornou o item equivalente ao último 1.

 
Postado : 18/12/2013 11:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

E uma matricial que retorna o mesmo valor, pode ser assim:

=ÍNDICE($B:$B;MÁXIMO(LIN($A$1:$A$19)*--($A$1:$A$19=$D$2));1)

Não esquecer do Ctrl+Shift+Enter

 
Postado : 18/12/2013 11:39 am
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Ok, vamos lá

=PROC(2;1/(A2:A19=$D2);B2:B19)

Primeiro que aqui, o que é usado é PROC() e não PROCV().
O PROC(): valor procurado, matriz de busca, matriz de resultados.

Quanto a ser ou não ser matricial, o PROC funcionou bem em ambos os casos (ou seja, com Enter ou com Ctrl+Shift+Enter deu o mesmo resultado)

Seguindo, este foi um caso interessante onde se aproveitou de uma caractetrística do PROC que pode ser considerada limitação, para atingir o objetivo.
Para que o PROC() funcione, ele precisa necessariamente ter a coluna de busca classificada em ordem crescente. O que no exemplo, não é o caso.
A matriz de busca neste exemplo é uma matriz de comparações do intervalo de CPFs com o conteúdo da célula de busca, porém colocando o "1/" no começo da matriz, tem-se uma matriz de 1s (uns) e de erros de divisão por zero.
O interessante está no valor procurado, que neste caso é 2. que não existe na matriz de busca que deveria ser em ordem crescente. Então, o PROC() por padrão retorna o resultado (da coluna de resultados) do último valor mais próximo do valor procurado, ou seja, do último 1.

Não sei se fui claro, mas vou tentar mostrar passo a passo:

passo a passo:
=PROC(2; 1/(A2:A19=$D2); B2:B19)

distrinchando:
=PROC(2; 1/{VERDADEIRO; FALSO;FALSO;FALSO;FALSO;FALSO;FALSO; FALSO;FALSO;VERDADEIRO;FALSO;FALSO;FALSO; FALSO;VERDADEIRO; FALSO;FALSO;FALSO}; B2:B19)

Essa é uma matriz de verdadeiros e falsos, que pode ser considerada uma matriz de 1s e 0s. No próximo passo, o Excel divide 1 pela matriz.
Resultando:
=PROC(2; {1;#DIV/0!; #DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!; #DIV/0!;#DIV/0!;#DIV/0!;1;#DIV/0!;#DIV/0!;#DIV/0!; #DIV/0!; 1 ; #DIV/0!;#DIV/0!;#DIV/0!}; B2:B19)

Dentro da explicação acima, agora ficou simples:
O PROC() procurou de cima pra baixo, pq ele funciona assim.
Procurou o 2. Na matriz de busca, não existe o 2. Então ele foi até o fim, procurando.
Quando viu que não encontrou, retornou o item equivalente ao último 1.

Muito bom!!! Show de bola! Ficou bem legal a explicação.
Coloquei "PROCV REVERSO" mas sabia que era proc.

Você saberia montar algo desse tipo usando fórmulas matriciais que eu estava tentando montar algo com esse objetivo.

Att,
Luis

 
Postado : 18/12/2013 11:47 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Já mandei.
Acho que eqto vc lia a explicação, eu já mandei a matricial.
Dá uma olhadinha, logo abaixo da minha resposta, tá lá!

FF

 
Postado : 18/12/2013 11:49 am
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Já mandei.
Acho que eqto vc lia a explicação, eu já mandei a matricial.
Dá uma olhadinha, logo abaixo da minha resposta, tá lá!

FF

Opa desculpa!!!
Show de bola!!! Agora... ehm.... explica por gentileza?! :shock:
O que eu entendi:
=índice - você vai dar a referência da linha do que é procurado (uso muito índice corresp então sei o que vc pretendeu aqui)
Minha dúvida está como foi apontada a linha correta.
"MÁXIMO(LIN($A$1:$A$19)*--($A$1:$A$19=$D$2))" isto aqui para mim ta em Grego/ Alien nunca nem vi "*--" você poderia destrinchar por favor? Isso não foi sacada de Ninja de Excel, ta mais para Jedi do Excel :D

Obrigado pela atenção mais uma vez.

 
Postado : 18/12/2013 12:03 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ok, vou abrir só o pedaço da linha, e vai ficar bem claro:
Observe, antes de eu começar, que eu tenho uma multiplicação de matrizes. o Sinal de vezes (representado pelo asterisco) indica a multiplicação.

MÁXIMO(LIN($A$1:$A$19)*--($A$1:$A$19=$D$2))

Em matriz, eu falei, me dê todos os números de linhas das células A1 até A19.
Ou seja, a primeira matriz ficou assim:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19}

Já a segunda matriz é a comparação simples do intervalo com o CPF procurado, que resulta na mesma matriz de verdadeiros e falsos vista anteriormente. Eu prefiro sempre multiplicar essa matriz por 1, ou duas vezes por -1, o que transforma a matriz de verdadeiros e falsos em uma matriz de 1s e 0s. Por isso usei o -- junto da comparação.
No final da comparação multiplicada por -- (ou seja, -1*-1*(verdadeiros e falsos)
a matriz ficou assim:
{1; 0;0;0;0;0;0; 0;0;1;0;0;0; 0;1; 0;0;0}

Agora sim, voltando à multiplicação de matrizes, lembra?
uma matriz vezes a outra, vai me dar uma matriz somente com as linhas onde o CPF aparece.
Assim:
{1;0;0;0;0;0;0; 0;0;10;0;0;0;0; 0;16; 0;0;0}
O Máximo() me devolve a maior linha, neste exemplo, 16.

;-)

 
Postado : 18/12/2013 12:15 pm
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Ok, vou abrir só o pedaço da linha, e vai ficar bem claro:
Observe, antes de eu começar, que eu tenho uma multiplicação de matrizes. o Sinal de vezes (representado pelo asterisco) indica a multiplicação.

MÁXIMO(LIN($A$1:$A$19)*--($A$1:$A$19=$D$2))

Em matriz, eu falei, me dê todos os números de linhas das células A1 até A19.
Ou seja, a primeira matriz ficou assim:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19}

Já a segunda matriz é a comparação simples do intervalo com o CPF procurado, que resulta na mesma matriz de verdadeiros e falsos vista anteriormente. Eu prefiro sempre multiplicar essa matriz por 1, ou duas vezes por -1, o que transforma a matriz de verdadeiros e falsos em uma matriz de 1s e 0s. Por isso usei o -- junto da comparação.
No final da comparação multiplicada por -- (ou seja, -1*-1*(verdadeiros e falsos)
a matriz ficou assim:
{1; 0;0;0;0;0;0; 0;0;1;0;0;0; 0;1; 0;0;0}

Agora sim, voltando à multiplicação de matrizes, lembra?
uma matriz vezes a outra, vai me dar uma matriz somente com as linhas onde o CPF aparece.
Assim:
{1;0;0;0;0;0;0; 0;0;10;0;0;0;0; 0;16; 0;0;0}
O Máximo() me devolve a maior linha, neste exemplo, 16.

;-)

Show de bola mesmo!! CLAP CLAP CLAP...
Toda vez que eu tiver uma matriz comparativa (que retorne Verdadei/Falso) consigo fazer essa transformação de 1 e 0 através da multiplicação da matriz por 1 ou (-1)²?
Muito obrigado pela aula. Show de bola mesmo!
:D

 
Postado : 18/12/2013 1:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Na verdade, multiplique por 1.
eu uso um conceito da matemática dos mais antigos, diz que menos com menos dá mais.
ou seja, ou vc faz
1*(matriz)

ou vc faz
-1*-1*(matriz)
que eh o mesmo que
--*(matriz)

Em teoria, seria o mesmo que somar 0 . . . *(nunca testei)
;-)

 
Postado : 18/12/2013 1:10 pm
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 

Ok, vou abrir só o pedaço da linha, e vai ficar bem claro:
Observe, antes de eu começar, que eu tenho uma multiplicação de matrizes. o Sinal de vezes (representado pelo asterisco) indica a multiplicação.

MÁXIMO(LIN($A$1:$A$19)*--($A$1:$A$19=$D$2))

Em matriz, eu falei, me dê todos os números de linhas das células A1 até A19.
Ou seja, a primeira matriz ficou assim:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19}

Já a segunda matriz é a comparação simples do intervalo com o CPF procurado, que resulta na mesma matriz de verdadeiros e falsos vista anteriormente. Eu prefiro sempre multiplicar essa matriz por 1, ou duas vezes por -1, o que transforma a matriz de verdadeiros e falsos em uma matriz de 1s e 0s. Por isso usei o -- junto da comparação.
No final da comparação multiplicada por -- (ou seja, -1*-1*(verdadeiros e falsos)
a matriz ficou assim:
{1; 0;0;0;0;0;0; 0;0;1;0;0;0; 0;1; 0;0;0}

Agora sim, voltando à multiplicação de matrizes, lembra?
uma matriz vezes a outra, vai me dar uma matriz somente com as linhas onde o CPF aparece.
Assim:
{1;0;0;0;0;0;0; 0;0;10;0;0;0;0; 0;16; 0;0;0}
O Máximo() me devolve a maior linha, neste exemplo, 16.

;-)

Uma coisa que me está acontecendo agora que estou brincando aqui com o que você me explicou... porque estou com um resultado diferente quando fixo os limites da matriz para o índice?
Fiz isso:
{=ÍNDICE($B2:$B19;MÁXIMO(LIN($A$2:$A$19)*--($A$2:$A$19=$D$2));1)}
Fixei o limite $B2$:$B$19 e só de mudar isso, a responsta deixa de ser MAMA e é GEGE... Ai deu tilt aki...

 
Postado : 18/12/2013 1:19 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 
{=ÍNDICE($B2:$B19;MÁXIMO(LIN($A$2:$A$19)*--($A$2:$A$19=$D$2));1)} 

é pq seu índice não está começando na linha 1... vc está mandando o número correto e exato da linha, para uma matriz que começa na linha 2 (b2:b19)...

eu coloquei b:b por causa disso.
Para este seu caso dar certo, vc teria que subtrair 1 no número da linha que é resultado do máximo():

{=ÍNDICE($B2:$B19;MÁXIMO(LIN($A$2:$A$19)*--($A$2:$A$19=$D$2))-1;1)}

Eu não gosto muito, mas funciona tb!

FF

 
Postado : 18/12/2013 1:22 pm
(@finaljustice)
Posts: 91
Estimable Member
Topic starter
 
{=ÍNDICE($B2:$B19;MÁXIMO(LIN($A$2:$A$19)*--($A$2:$A$19=$D$2));1)} 

é pq seu índice não está começando na linha 1... vc está mandando o número correto e exato da linha, para uma matriz que começa na linha 2 (b2:b19)...

eu coloquei b:b por causa disso.
Para este seu caso dar certo, vc teria que subtrair 1 no número da linha que é resultado do máximo():

{=ÍNDICE($B2:$B19;MÁXIMO(LIN($A$2:$A$19)*--($A$2:$A$19=$D$2))-1;1)}

Eu não gosto muito, mas funciona tb!

FF

Muito obrigado pela ajuda, vamos ver se consigo expandir isso ai! Valeu pela aula mesmo!!!
Abs,
Luis

 
Postado : 18/12/2013 1:28 pm
(@vic7or)
Posts: 94
Estimable Member
 

Obrigado à vocês dois pelo excelente tópico.
Foi extremamente educativo.

Nosso amigo Fernando Fernandes sempre dá um jeitinho e já me tirou de muitas enrascadas.
Isso aqui deve se tornar um tópico fixo e referência nacional/mundial/universal/transcendental.. hehehe

Obrigado finaljustice por compartilhar essa base e ao Fernando por explicar com tanta clareza o problema!

Favoritado certamente. Vou imprimir isso e deixar na minha carteira. Haha

 
Postado : 30/01/2014 1:49 pm
Página 1 / 2