VBA VLOOKUP e XLOOKUP

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

Daniel Caramello

Last updated on June 9, 2023

Este artigo demonstrará como usar as funções VLOOKUP e XLOOKUP no VBA.

As funções VLOOKUP e XLOOKUP (PROCV e PROCX) do Excel são extremamente úteis. Elas também podem ser usadas na codificação VBA.

VLOOKUP

Há duas maneiras de chamar a função VLOOKUP no VBA:

  • Application.WorksheetFunction.Vlookup
  • Application.Vlookup

Os dois métodos funcionam de forma idêntica, exceto pela maneira como tratam os erros.

Application.WorksheetFunction.VLookup

Este exemplo demonstrará o primeiro método.

exemplo procv manual

 

Aqui, criamos uma fórmula VLOOKUP (PROCV) no Excel que será replicada no VBA:

Sub PesquisaPreco()
   ActiveCell = Application.WorksheetFunction.VLookup(Range("E3"), Range("B2:C6"), 2, False)
End Sub

Isso resultará no seguinte:

resultado sem formula

Observe que o resultado real foi gravado na célula F3 em vez de na fórmula!

Se quisermos retornar uma fórmula para o Excel em vez de um valor, escreva o VLOOKUP em uma fórmula:

Sub PesquisaPreco()
   ActiveCell = "=VLOOKUP(E3,B2:C6,2,FALSE)"
End Sub

Ou você pode escrever a fórmula em uma célula usando a notação R1C1, que cria uma fórmula com referências relativas que podem ser usadas em um intervalo de células:

Sub PesquisaPreco() 
  ActiveCell = "=VLOOKUP(RC[-1],RC[-4]:R[3]C[-3],2,FALSE)"
End Sub

Você também pode usar variáveis para definir as entradas VLOOKUP:

Sub PesquisaPreco()
 Dim strProduct As String
 Dim rng As Range 
 strProduct = Range("E3") 
 Set rng = Range("B2:C6") 
 ActiveCell = Application.WorksheetFunction.VLookup(strProduct, rng, 2, False)
End Sub

É claro que, em vez de gravar os resultados da função em uma célula, você pode gravar os resultados em uma variável:

Sub PesquisaPreco() 
  Dim strProduct As String
  Dim rng As Range 
  Dim strResult as String
 
  strProduct = Range("E3") 
  Set rng = Range("B2:C6") 
  strResult = Application.WorksheetFunction.VLookup(strProduct, rng, 2, False) 
End Sub

Application.VLookup vs. Application.WokrsheetFunction.VLookup

Nos exemplos acima, podemos usar qualquer um dos métodos e eles retornarão o mesmo resultado. No entanto, e se estivéssemos procurando um produto que não existe – que resultado isso retornaria? Cada função retornaria um resultado muito diferente.

Normalmente, ao usar a função PROCV no Excel, se a pesquisa não encontrar a resposta correta, ela retornará #N/D para a célula. No entanto, se usarmos o exemplo acima e procurarmos um produto que não existe, acabaremos com um erro de VBA.

exemplo-nao-encontrado

Podemos detectar esse erro em nosso código e retornar uma mensagem mais amigável ao usuário quando o item que estamos procurando não for encontrado.

Sub PesquisaPreco()
  On Error GoTo eh
  ActiveCell = Application.WorksheetFunction.VLookup(Range("E3"), Range("B2:C6"), 2, False)
  Exit Sub
eh:
  MsgBox "Produto não encontrado - tente outro produto"
End Sub

Como alternativa, podemos alterar nosso código VBA para usar Application.Vlookup em vez de Application.WorksheetFunction.VLookup.

Sub PesquisaPreco()
  ActiveCell = Application.VLookup(Range("E3"), Range("B2:C6"), 2, False)
End Sub

Quando fazemos isso, o #N/D que esperamos quando um valor de pesquisa não é encontrado é retornado à célula.

evitando erro application vlookup

WorksheetFunction.XLOOKUP

A função XLOOKUP (PROCX) foi projetada para substituir as funções VLOOKUP e HLOOKUP no Excel. Ela só está disponível para o Office 365, portanto, o uso dessa função é bastante restritivo se alguns dos seus usuários estiverem usando versões mais antigas do Excel.

Ela funciona de maneira muito semelhante à função VLOOKUP no VBA.

Sub PesquisaPrecoV()
   ActiveCell = Application.WorksheetFunction.XLookup(Range("E3"), Range("B2:B6"), Range("C2:C6"))
End Sub

OU

Sub PesquisaPrecoV() 
   ActiveCell = Application.XLookup(Range("E3"), Range("B2:B6"), Range("C2:C6")) 
End Sub

Mais uma vez, se quisermos usar variáveis, podemos escrever o seguinte código

Sub PesquisaPrecoV()
   Dim strProduct As String
   Dim rngProduct As Range
   Dim rngPrice As Range
   strProduct = Range("E3")
   Set rngProduct = Range("B2:B6")
   Set rngPrice = Range("C2:C6")
   ActiveCell = Application.WorksheetFunction.XLookup(strProduct, rngProduct, rngPrice)
End Sub

Se quisermos retornar uma fórmula para o Excel em vez de um valor, precisaremos escrever a fórmula no Excel com o código VBA.

Sub PesquisaPreco()
   ActiveCell = "=XLOOKUP(E3,B3:B6,C3:C6)"
End Sub

Ou você pode escrever a fórmula em uma célula usando a notação R1C1.

Sub PesquisaPreco() 
  ActiveCell.Formula2R1C1 = "=XLOOKUP(RC[-1],RC[-4]:R[3]C[-4],RC[-3]:R[3]C[-3])"
End Sub

Uma das principais vantagens do uso do XLOOKUP em relação ao VLOOKUP é a capacidade de pesquisar um intervalo de colunas e retornar o valor em cada coluna.

Vejamos o exemplo a seguir:

exemplo procx transborda

Criamos a fórmula na célula H3, onde ela está procurando os valores no intervalo C2:E6. Devido ao fato de serem várias colunas, ela preencherá automaticamente as colunas I e J com os resultados correspondentes encontrados. A fórmula transborda para as colunas I e J sem que tenhamos que usar CTRL+SHIFT para uma fórmula de matriz – essa capacidade da fórmula de transbordar é uma das novas adições do Excel 365.

Para replicar isso com o código VBA, podemos digitar o seguinte em nossa macro:

Sub PesquisaPreco()
   ActiveCell.Formula2R1C1 = "=XLOOKUP(RC[-1],RC[-6]:R[3]C[-6],RC[-5]:R[3]C[-3])"
End Sub

Onde a fórmula está usando a sintaxe R1C1 (linhas e colunas) em vez da sintaxe A1 (intervalo). Isso fará com que as fórmulas sejam inseridas no Excel conforme mostrado no gráfico acima.

Não é possível pesquisar várias colunas se você estiver usando o método WorksheetFunction.

vba-free-addin

Exemplos de Add-ins de Códigos VBA

Acesse facilmente todos os exemplos de código que se encontram em nosso site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(Nenhuma instalação necessária!)

Baixe de Graça

Retornar aos Exemplos de Códigos VBA