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

Download Retornar Todas as Correspondências de um PROCV - Excel - Ambiente Office

Post on 03-Jan-2016

647 views

Category:

Documents

7 download

Embed Size (px)

TRANSCRIPT

  • 24/05/13 Retornar Todas as Correspondncias 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 Correspondncias de um PROCV

    ltima atualizao: 30/03/2012

    Introduo

    Exemplo

    -Explicao

    Retornar Correspondncias numa nica Clula

    Referncias

    Introduo

    A funo PROCV uma das mais utilizadas do Excel. J escrevi um artigo sobre essa funo no site (clique aqui para visitarentanto, ela possui uma limitao: retorna apenas a primeira correspondncia encontrada de um vetor.

    Este artigo mostra como retornar todas as correspondncias de um PROCV.

    Exemplo

    Considere a tabela abaixo:

  • 24/05/13 Retornar Todas as Correspondncias 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 Cdigo de todas as correspondncia de Felipe (a100, b842, e823 e f431). Digite, por exemplo, em e em C15 a frmula:

    =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)))) (frmula matricial)

    Observe que se trata de uma frmula matricial, portanto deve ser entrada comntrada com Ctrl+Shift+Enter. Para saber mais sobrefrmulas matriciais, clique aqui:

    Nessa frmula,

    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 correspondncia de Felipe (a100, b842, e823 e f431)

    B$3 a primeira clula onde se iniciam os dados do intervalo procurado.

    Observe que ao apertar Ctrl+Shift+Enter, a frmula retornou apenas o primeiro resultado, que a100. Para ver os outros resultados,basta clicar no canto direito inferior da clula, arrastar o mouse para baixo e soltar o boto:

    Os resultados em branco abaixo de f431 significa que no h mais correspondncias para Felipe. Elimine (delete) esses resultados embranco, se desejar. Se quiser localizar as correspondncias das Cores, basta copiar e colar (Ctrl+C, Ctrl+V) a frmula para a direita queas referncias esto ajustadas para retornar as correspondncias das colunas subsequentes.

    Observe a funo PROCV no foi escrita em nenhuma parte da frmula. Ela foi utilizada no ttulo apenas como um neologismo, j quenessa frmula quem faz o papel de PROCV a funo NDICE.

    Alternativamente, voc pode optar para os valores aparecerem horizontalmente ao invs de verticlamente, como mostrado abaixo:

  • 24/05/13 Retornar Todas as Correspondncias de um PROCV - Excel - Ambiente Office

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

    Basta usar a frmula, 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)))) (frmula matricial)

    Note que a nica alterao que foi feita foi trocar LINS($1:1) da frmula no formato anterior por COLS($A:A). Abaixo h a explicaoda frmula na primeira forma, se tiver dvida em como aplicar dessa segunda forma, me envie um e-mail.

    Explicao

    Nota: Para melhor entendimento, considere que estamos avaliando a frmula usando o exemplo acima na clula D17. Logo, estaremosfazendo o passo a passo para essa frmula que buscar a terceira correspondncia com o valor Felipe, j que a primeira e segundacorrespondncias j foram retornadas nas duas linhas superiores com a mesma frmula, mas referncia alterada.

    Em primeiro lugar, voc deve ter percebido que se todas as correspondncias da frmula j foram mostradas, a mesma retorna seja, vazio. Observe a regio destacada abaixo:

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

    Nota-se pela referncia relativa em LINS($1:3) que medida que se cola a frmula para baixo, vai-se de LINS($1:1), LINS($1:2)LINS($1:3) e assim por diante. O resultado de cada uma dessas frmulas igual a, respectivamente, 1, 2 e 3. uma forma da frmulaarmazenar quantos resultados j foram encontrados.

    Se o nmero de resultados encontrados for maior que o nmero de ocorrncias de Felipe (que calculado pela frmulaCONT.SE($B$3:$B$13;$B$15)), ento todas as correspondncias j foram encontradas e ento a frmula retorna "", ou seja, Caso contrrio, deve-se retornar o parmetro NDICE(... clula. Resumindo: nessa frmula este primeiro SE tem a funo de retornarvazio "" se todas as ocorrncias do "PROCV" j foram encontradas.

    Da frmula restante, o trecho que retorna qual a prxima correspondncia :

    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 nmero 10 do vetor D$3:D$13, que corresponde ocorrncia Vermelho j que os ndices 1 ((Azul) j foram retornados pela frmula nas linhas de cima (observe que, nesse vetor, o ndice 1 = Verde, 2 = Amarelo, 3 = AzulBranco e assim por diante).

    O clculo do NDICE retornado no vetor ento dado por:

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

    A frmula acima diz que o NDICE o terceiro MENOR valor no vetor em azul (no se esquea que estamos avaliando a frmula emD17, ou seja, para se buscar a terceira ocorrncia de uma Cor para Felipe).

    Essa parte a mais importante da frmula: observe que o vetor ao qual a funo MENOR l formado a partir da funo SE

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

    O objetivo dessa parte da frmula criar um vetor numrico 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 expresso LIN($B$3:$B$13)-LIN(C$3)+1 se encarrega de fazer isso.

    No entanto, faz-se algumas modificaes nesse vetor: para os elementos que no possuem a correspondncia $B$3:$B$13o valor FALSO atribudo no lugar do nmero. Logo, nosso vetor ficar:

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

    Ora, a funo MENOR est ajustada para retornar o terceiro menor valor, que 10. Logo, o NDICE nmero 10 do vetor D$3:D$13elemento Vermelho, que corresponde terceira correspondncia do vetor para o valor de busca Felipe.

    Por ltimo, entenda a construo do vetor LIN($B$3:$B$13)-LIN(C$3)+1, citado anteriormente conforme. Considere a expressoabaixo, reescrita em outras cores:

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

    Sabe-se que a funo LIN retorna o nmero da linha de uma referncia. Observe como se chega ao resultado desejado:

  • 24/05/13 Retornar Todas as Correspondncias de um PROCV - Excel - Ambiente Office

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

    Retornar Correspondncias numa nica Clula

    Suponha, no exemplo acima, que voc deseje retornar todas as correspondncias numa nica clula:

    Veja que todas as correspondncias esto sendo retornadas numa nica clula atravs 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 elano possui o ltimo parmetro e retorna todas as correspondncias na mesma clula.

    A declarao da UDF :

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

    Basicamente, a funo faz um lao na primeira coluna da matriz vBD buscando o termo sProcura, e concatena uma correspondncia nacoluna lngOffset de distncia do elemento encontrado no vetor.

    Logo, a frmual fica como:

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

    O cdigo dessa UDF :

    Function PROCVCONCAT(sProcura As String, vBD As Variant, lngOffset As Long) 'Altere essa constante se quiser utilizar outro caractere como dgito separador. Const strSeparador As String = ";" Dim l As Long Dim lngTotal As Long Dim strTemp() As String Dim varTemp As Variant 'Transformo o parmetro 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 correspondncia 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 no seja encontrada nenhuma correspondncia, a funo retornar uma clula vazia. PROCVCONCAT = "" Exit Function Else 'Join concatena todas as correspondncias 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 Correspondncias 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) 0 Then IsArrayEmpty = TrueEnd Function

    Referncias

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

    ---

    Site de Felipe Costa Gualberto.

    Belo Horizonte, Brasil, 2009-2013.

    benzadeus5@ambienteoffice.com.br