retornar todas as correspondências de um procv - excel - ambiente office

5

Upload: pacoricardo777

Post on 03-Jan-2016

704 views

Category:

Documents


7 download

TRANSCRIPT

24/05/13 Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

www.ambienteoffice.com.br/excel/retornar_todas_as_correspondencias_de_um_PROCV/ 1/5

Busque neste site:

Pesquisar

Retornar Todas as Correspondências de um PROCV

Última atualização: 30/03/2012

Introdução

Exemplo

-Explicação

Retornar Correspondências numa Única Célula

Referências

Introdução

A função PROCV é uma das mais utilizadas do Excel. Já escrevi um artigo sobre essa função no site (clique aqui para visitarentanto, ela possui uma limitação: retorna apenas a primeira correspondência encontrada de um vetor.

Este artigo mostra como retornar todas as correspondências de um PROCV.

Exemplo

Considere a tabela abaixo:

24/05/13 Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

www.ambienteoffice.com.br/excel/retornar_todas_as_correspondencias_de_um_PROCV/ 2/5

Suponha que você queria o Código de todas as correspondência de Felipe (a100, b842, e823 e f431). Digite, por exemplo, em e em C15 a fórmula:

=SE(LINS($1:1)>CONT.SE($B$3:$B$13;$B$15);"";ÍNDICE(C$3:C$13;MENOR(SE($B$3:$B$13=$B$15;LIN($B$3:$B$13LIN(B$3)+1;FALSO);LINS($1:1)))) (fórmula matricial)

Observe que se trata de uma fórmula matricial, portanto deve ser entrada comntrada com Ctrl+Shift+Enter. Para saber mais sobrefórmulas matriciais, clique aqui:

Nessa fórmula,

B$15 é o valor procurado (Felipe)

B$3:B$13 é o intervalo em que será procurado Felipe.

C$3:C$13 é o intervalo que será retornado a correspondência de Felipe (a100, b842, e823 e f431)

B$3 é a primeira célula onde se iniciam os dados do intervalo procurado.

Observe que ao apertar Ctrl+Shift+Enter, a fórmula retornou apenas o primeiro resultado, que é a100. Para ver os outros resultados,basta clicar no canto direito inferior da célula, arrastar o mouse para baixo e soltar o botão:

Os resultados em branco abaixo de f431 significa que não há mais correspondências para Felipe. Elimine (delete) esses resultados embranco, se desejar. Se quiser localizar as correspondências das Cores, basta copiar e colar (Ctrl+C, Ctrl+V) a fórmula para a direita queas referências estão ajustadas para retornar as correspondências das colunas subsequentes.

Observe a função PROCV não foi escrita em nenhuma parte da fórmula. Ela foi utilizada no título apenas como um neologismo, já quenessa fórmula quem faz o papel de PROCV é a função ÍNDICE.

Alternativamente, você pode optar para os valores aparecerem horizontalmente ao invés de verticlamente, como mostrado abaixo:

24/05/13 Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

www.ambienteoffice.com.br/excel/retornar_todas_as_correspondencias_de_um_PROCV/ 3/5

Basta usar a fórmula, neste caso, na forma:

=SE(COLS($A:A)>CONT.SE($B$3:$B$13;$Z$10); "";ÍNDICE($C$3:$C$13;MENOR(SE($B$3:$B$13=$Z$10;LIN($B$3:$B$13) -LIN($B$3)+1;FALSO); COLS($A:A)))) (fórmula matricial)

Note que a única alteração que foi feita foi trocar LINS($1:1) da fórmula no formato anterior por COLS($A:A). Abaixo há a explicaçãoda fórmula na primeira forma, se tiver dúvida em como aplicar dessa segunda forma, me envie um e-mail.

Explicação

Nota: Para melhor entendimento, considere que estamos avaliando a fórmula usando o exemplo acima na célula D17. Logo, estaremosfazendo o passo a passo para essa fórmula que buscará a terceira correspondência com o valor Felipe, já que a primeira e segundacorrespondências já foram retornadas nas duas linhas superiores com a mesma fórmula, mas referência alterada.

Em primeiro lugar, você deve ter percebido que se todas as correspondências da fórmula já foram mostradas, a mesma retorna seja, vazio. Observe a região destacada abaixo:

=SE(LINS($1:3)>CONT.SE($B$3:$B$13;$B$15);"";ÍNDICE(...

Nota-se pela referência relativa em LINS($1:3) que à medida que se cola a fórmula para baixo, vai-se de LINS($1:1), LINS($1:2)LINS($1:3) e assim por diante. O resultado de cada uma dessas fórmulas é igual a, respectivamente, 1, 2 e 3. É uma forma da fórmulaarmazenar quantos resultados já foram encontrados.

Se o número de resultados encontrados for maior que o número de ocorrências de Felipe (que é calculado pela fórmulaCONT.SE($B$3:$B$13;$B$15)), então todas as correspondências já foram encontradas e então a fórmula retorna "", ou seja, Caso contrário, deve-se retornar o parâmetro ÍNDICE(...à célula. Resumindo: nessa fórmula este primeiro SE tem a função de retornarvazio "" se todas as ocorrências do "PROCV" já foram encontradas.

Da fórmula restante, o trecho que retorna qual é a próxima correspondência é:

ÍNDICE(D$3:D$13;MENOR(SE($B$3:$B$13=$B$15;LIN($B$3:$B$13)-LIN(C$3)+1;FALSO);LINS($1:3)))

Ou seja, buscaremos o ÍNDICE número 10 do vetor D$3:D$13, que corresponde à ocorrência Vermelho já que os índices 1 ((Azul) já foram retornados pela fórmula nas linhas de cima (observe que, nesse vetor, o índice 1 = Verde, 2 = Amarelo, 3 = AzulBranco e assim por diante).

O cálculo do ÍNDICE retornado no vetor então é dado por:

MENOR(SE($B$3:$B$13=$B$15;LIN($B$3:$B$13)-LIN(C$3)+1;FALSO);LINS($1:3))

A fórmula acima diz que o ÍNDICE é o terceiro MENOR valor no vetor em azul (não se esqueça que estamos avaliando a fórmula emD17, ou seja, é para se buscar a terceira ocorrência de uma Cor para Felipe).

Essa parte é a mais importante da fórmula: observe que o vetor ao qual a função MENOR lê é formado a partir da função SE

SE($B$3:$B$13=$B$15;LIN($B$3:$B$13)-LIN(C$3)+1;FALSO)

O objetivo dessa parte da fórmula é criar um vetor numérico crescente do tipo {1;2;3;4;...;n} do tamanho do vetor de procura, que nonosso caso é {1;2;3;4;5;6;7;8;9;10;11}. A expressão LIN($B$3:$B$13)-LIN(C$3)+1 se encarrega de fazer isso.

No entanto, faz-se algumas modificações nesse vetor: para os elementos que não possuem a correspondência $B$3:$B$13o valor FALSO é atribuído no lugar do número. Logo, nosso vetor ficará:

{1;FALSO;3;FALSO;FALSO;FALSO;FALSO;FALSO;FALSO;10;11}

Ora, a função MENOR está ajustada para retornar o terceiro menor valor, que é 10. Logo, o ÍNDICE número 10 do vetor D$3:D$13elemento Vermelho, que corresponde à terceira correspondência do vetor para o valor de busca Felipe.

Por último, entenda a construção do vetor LIN($B$3:$B$13)-LIN(C$3)+1, citado anteriormente conforme. Considere a expressãoabaixo, reescrita em outras cores:

LIN($B$3:$B$13)-LIN(C$3)+1

Sabe-se que a função LIN retorna o número da linha de uma referência. Observe como se chega ao resultado desejado:

24/05/13 Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

www.ambienteoffice.com.br/excel/retornar_todas_as_correspondencias_de_um_PROCV/ 4/5

Retornar Correspondências numa Única Célula

Suponha, no exemplo acima, que você deseje retornar todas as correspondências numa única célula:

Veja que todas as correspondências estão sendo retornadas numa única célula através de uma UDF (pretendo escrever mais sobreUDFs em breve) chamada PROCVCONCAT. Ela é semelhante ao PROCV (clique aqui para aprender a usar o PROCV), exceto que elanão possui o último parâmetro e retorna todas as correspondências na mesma célula.

A declaração da UDF é:

Function PROCVCONCAT(sProcura As String, vBD As Variant, lngOffset As Long)

Basicamente, a função faz um laço na primeira coluna da matriz vBD buscando o termo sProcura, e concatena uma correspondência nacoluna lngOffset de distância do elemento encontrado no vetor.

Logo, a fórmual fica como:

=PROCVCONCAT(F2;$B$3:$D$13;3)

O código dessa UDF é:

Function PROCVCONCAT(sProcura As String, vBD As Variant, lngOffset As Long) 'Altere essa constante se quiser utilizar outro caractere como dígito separador. Const strSeparador As String = ";" Dim l As Long Dim lngTotal As Long Dim strTemp() As String Dim varTemp As Variant 'Transformo o parâmetro de entrada (que pode ser uma matriz ou uma Range) para trabalhar 'apenas com uma Variant: varTemp = CVar(vBD) For l = LBound(varTemp, 1) To UBound(varTemp, 1) If varTemp(l, 1) = sProcura Then 'Foi encontrada uma correspondência na primeira coluna do vetor de varTemp. lngTotal = lngTotal + 1 ReDim Preserve strTemp(1 To lngTotal) strTemp(lngTotal) = varTemp(l, lngOffset) End If Next l If IsArrayEmpty(strTemp) Then 'Caso não seja encontrada nenhuma correspondência, a função retornará uma célula vazia. PROCVCONCAT = "" Exit Function Else 'Join concatena todas as correspondências encontradas do vetor strTemp: PROCVCONCAT = Join(strTemp, strSeparador) End If End Function

Function IsArrayEmpty(v As Variant) As Boolean

24/05/13 Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

www.ambienteoffice.com.br/excel/retornar_todas_as_correspondencias_de_um_PROCV/ 5/5

Function IsArrayEmpty(v As Variant) As Boolean 'Retorna True se um vetor for vazio. On Error Resume Next If LBound(v) <= UBound(v) Then IsArrayEmpty = False End If

If Err.Number > 0 Then IsArrayEmpty = TrueEnd Function

Referências

Para fazer o download de um exemplo pronto (Pasta de Trabalho), clique aqui.

---

Site de Felipe Costa Gualberto.

Belo Horizonte, Brasil, 2009-2013.

[email protected]