Jorge Paulino

Visual Basic em Português, MVP

Recent Posts

Tags



 
Administr. da Comunidade
Portugal-a-Programar


Membro da Comunidade
Experts-Exchange


Twitter
Artigos no CodeProject
Artigos no CodeProject 

Email Notifications

Archives

Excel: Formulas Personalizadas - xLookup

O Excel tem algumas de funções de pesquisa muito utilizadas, como é o caso do VLOOKUP(), HLOOKUP(), INDEX(), etc. Estas funções permitem pesquisar por um valor e, em alguns casos, retornar um resultado de uma coluna adjacente.

Por exemplo a função VLOOKUP() funciona da seguinte forma:

=VLOOKUP(«valor a procurar»;«área a procurar»;«coluna retorno»;«busca parcial»)

Como podem ver na imagem, a tabela de valores vai de A2 a B11. Se colocarmos o valor “1” em A14 (que será o valor a pesquisar) e a formula =VLOOKUP(A14;A2:B11;2;FALSE) na célula B14, teremos o seguinte resultado: “um”.

Isto é o funcionamento desta formula, que vai procurar um valor a uma área e retorna o valor de uma determinada coluna, da linha encontrada.

No entanto, podemos querer tornar esta função mais poderosa e com isso indicar vários valores e retornar vários resultados. Para isso podemos criar uma função personalizada (UDF - User Defined Function), que neste caso foi designada por xLookup().

 
    Public Function xVLOOKUP(ByVal str As String) As String
        Dim searchValues() As String
        Dim rng As Range, searchID As Range
        Dim x As Integer, columnIndex As Integer
        Dim result As String

        ' Define o area de pesquisa
        Set rng = [a2:b11]

        ' Define qual a coluna onde estão os resultados
        columnIndex = 2

        ' Separa os ID's que se encontram separados por
        ' ponto e virgula ao array criado
        searchValues = Split(str, ";")

        ' Ciclo nos ID's encontrados
        For x = 0 To UBound(searchValues)

            ' Pesquisa o ID na area definida(limpando também espaços)
            searchID = rng.Find(What:=Trim(searchValues(x)), SearchFormat:=False)

            ' Caso encontra colocar o resultado da linha encontrada
            ' e de acordo com a coluna, caso contrário um texto geral
            If Not searchID Is Nothing Then
                result = result & Cells(searchID.Row, columnIndex).Value & ";"
            Else
                result = result & "Não Encontrado;"
            End If

        Next

        ' Atribui o resultado à função, removendo o ";" final
        If Len(result) > 1 Then
            xVLOOKUP = Mid(result, 1, Len(result) - 1)
        Else
            xVLOOKUP = result
        End If

    End Function

Neste caso, o que a função faz, é separar o valor de uma célula para uma array e depois pesquisar valor a valor, construindo o resultado.

 

Como podem na imagem, se colocarmos “1;2;3;1” na célula A17, e a formula =xVLOOKUP(A17) em B17, obtemos o resultado “um;dois;três;um”

É mais um exemplo de uma UDF e de como podemos criar novas formulas, para além das inúmeras que já que temos disponíveis. Mostra também como fazer uma pesquisa numa área definida e de como utilizar os resultados dessa pesquisa.

NOTA: Estas são aplicações práticas colocadas em fóruns, newsgroups, blogs, etc, e como mostram algum código e poderem ser utilizadas em outros contextos, são aqui publicadas.

Comments

Rute Serrano said:

Acabei agora de descobrir o teu site! Obrigada por ele, e espero q continues a oferecer alguns post poderosos como este. Obrigada!

# Janeiro 6, 2010 4:06

Jorge Paulino said:

Obrigado Rute Serrano!

Pode ver no meu blog outro blog (este é cross-post) por alguns artigos mais antigos de VBA: vbtuga.blogspot.com/.../Microsoft%20Excel

# Janeiro 8, 2010 6:53
Leave a Comment

(requerido) 

(requerido) 

(opcional)

 

(requerido) 

If you can't read this number refresh your screen
Enter the numbers above: