Programa
Se você já escreveu mais do que alguns macros em VBA, provavelmente passou por aquele momento em que precisa verificar se um texto existe dentro de uma célula. No VBA, InStr é uma daquelas funções que você acaba usando o tempo todo. Ela informa onde um trecho de texto aparece dentro de outro. Você pode usá-la para checar se um texto existe em uma célula, separar valores em um texto ou controlar lógicas condicionais em macros que dependem de padrões de texto.
Neste guia, vou apresentar a sintaxe de InStr, alguns exemplos, como funcionam os modos de comparação (essa parte confunde mais gente do que deveria) e alguns padrões que você realmente vai reutilizar.
Eu recomendo começar pela nossa trilha de habilidades Excel Fundamentals para construir uma base sólida antes de avançar para VBA, ou fazer o curso Advanced Excel Functions se você já tem alguma experiência, para aprender como funções aumentam a eficiência na análise de dados.
O que é a função InStr do VBA?
InStr é uma função do VBA que retorna a posição da primeira ocorrência de uma string dentro de outra.
Os resultados funcionam assim:
- Se encontrar, retorna um número (a posição onde a correspondência começa)
- Se não encontrar nada, retorna 0
Por exemplo, se “cat” aparece na posição 5 em uma string, você obtém 5. Se não estiver lá, você obtém 0.
Sintaxe do VBA InStr
Aqui está a sintaxe completa de InStr:
InStr([start], string1, string2, [compare])
Onde:
-
start(opcional): Indica ao VBA onde começar a busca. Se você não informar, o VBA começa na posição 1. -
string1(obrigatório): O texto completo no qual você está procurando. -
string2(obrigatório): O texto que você quer encontrar. -
compare(opcional): Define como a comparação é feita (sensível a maiúsculas/minúsculas ou não). Se você não informar, o VBA usa o modo padrão, geralmente sensível a maiúsculas/minúsculas.
Observe que você pode ignorar os argumentos start e compare (InStr(string1, string2)) para uma versão mais simples. Mas, se decidir usar o argumento compare, também precisa informar o argumento start.
Como o VBA InStr funciona
Pense em InStr como ler uma frase da esquerda para a direita, um caractere por vez.
A função começa com string1, percorre o texto e procura o primeiro ponto onde string2 corresponde. No momento em que encontra a correspondência, ela para e retorna a posição onde começou.
A posição da “correspondência” é importante, já que o VBA conta a partir de 1, não de 0. Assim, o primeiro caractere de uma string é a posição 1, o segundo é 2 e assim por diante.
Valores de retorno do VBA InStr explicados
Interpretar o resultado de InStr é simples. Você pode obter:
-
Número positivo: se encontrar uma correspondência, o número indica onde ela começa.
-
0: se não houver correspondência em nenhum lugar da string
Entretanto, se suas strings de entrada forem Null, a função retorna Null. Embora você possa ignorar isso em macros básicos, vale notar que essa diferença pode quebrar uma condição silenciosamente.
Exemplos básicos do VBA InStr
Agora, vou mostrar alguns exemplos de como usar a função InStr no VBA.
Encontrar uma palavra em uma frase
Para verificar se a palavra “before” está na observação “Deliver before noon”.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
O resultado do VBA acima é 9, pois “before” começa no 9º caractere.
Verificar se um caractere existe
Para verificar se o caractere “0” existe em uma string, use o VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
Nesse caso, qualquer resultado maior que 0 significa que o caractere foi encontrado.
Buscar desde o início de uma string
Para buscar desde o início de uma string, você não precisa especificar a posição inicial; ela começa em 1. Esse é o padrão, a menos que você diga o contrário.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Como usar VBA InStr em instruções If
Ao trabalhar com uma planilha de verdade, você não está apenas procurando um número; você está tentando tomar uma decisão. A maneira mais comum de usar InStr é dentro de um If para filtrar dados.
Ao longo deste tutorial, vamos usar um conjunto de dados de exemplo, Orders, com as colunas: ID, CustomerName, Email, City e OrderNotes.
If InStr(...) > 0 Then
Como InStr retorna 0 quando não encontra nada, verificamos se há resultado quando retorna um número maior que 0.
No exemplo abaixo, ele olha para a coluna OrderNotes (coluna 5). Se encontrar a palavra “Fragile”, escreve “Handle Carefully” na coluna 6.
Sub ChExist()
Dim i As Integer
' Loop pelas linhas 2 a 51
For i = 2 To 51
' Verifica se as observações do pedido mencionam "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Verificações condicionais por palavras‑chave e filtro de texto
Você também pode usar InStr para checar palavras‑chave em strings, especialmente quando a frase muda um pouco. Por exemplo, o código abaixo verifica se a observação contém “Call” (como “Call on arrival” ou “Call before delivery”). Em seguida, sinaliza e adiciona a tag “Cal Customer” na coluna 6.
Sub ChExist()
Dim i As Integer
' Loop pelas linhas 2 a 51
For i = 2 To 51
' Verifica se as observações do pedido mencionam “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
Sensibilidade a maiúsculas/minúsculas e modos de comparação do VBA InStr
Por padrão, InStr diferencia maiúsculas de minúsculas (chamado de vbBinaryCompare). Digamos que você procure por “chicago”, mas o dado está como “Chicago”: InStr vai retornar 0.
Para corrigir isso, use o argumento compare, em que:
-
vbBinaryCompare(padrão): sensível a maiúsculas/minúsculas (“A” não é o mesmo que “a”). -
vbTextCompare: não diferencia maiúsculas de minúsculas; “A” é o mesmo que “a”.
No exemplo abaixo, InStr retorna 0 porque procura “fragile” (minúsculo) dentro de “Fragile items”.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Já com vbTextCompare, o retorno é 1 para a mesma busca, ignorando o caso.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr com posição inicial
Às vezes você não quer começar a busca no início da string. O argumento start informa ao VBA onde começar a procurar.
No exemplo abaixo, o argumento start está definido como 10, então o VBA inicia a busca a partir do 10º caractere, em vez do primeiro. Depois, encontra "delivery" mais à frente na string.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
O resultado do exemplo acima é 31, que é a posição onde "delivery" começa.
Esse método é útil quando você quer a segunda ocorrência de algo ou ignorar um prefixo conhecido ao trabalhar com padrões repetidos.
VBA InStr vs. InStrRev
Como você já viu, InStr busca da esquerda para a direita. Já InStrRev busca da direita para a esquerda.
Por exemplo, usamos InStrRev para localizar o último ponto no e-mail. O resultado é 18, que é a posição do ponto antes de “com”.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
Você vai achar InStrRev mais útil quando precisa da última ocorrência de algo ou quando trabalha com nomes de arquivos, e-mails ou caminhos.
Casos de uso comuns do VBA InStr
Agora que vimos exemplos de como a função InStr funciona, vamos aos casos de uso mais comuns.
Verificar se uma célula contém uma palavra‑chave
Suponha que você tenha um conjunto de pedidos de clientes e precise sinalizar pedidos para um tratamento específico. O código olha a coluna OrderNotes e sinaliza qualquer coisa com “noon”.
Sub ChExist()
Dim i As Integer
' Loop pelas linhas 2 a 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Lógica para marcar como "Morning Delivery"
End If
Next i
End Sub
Validar texto no formato de e-mail
Você também pode usar InStr para checar rapidamente formatos de e-mail. Por exemplo, o código abaixo verifica se o e-mail contém @ e retorna “Valid Email Format” na coluna 6.
Sub ValidateEmail()
Dim i As Integer
' Loop pelas linhas 2 a 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Detectar separadores como vírgulas ou hifens
Você pode usar InStr para verificar se existe hífen, vírgula ou barra em um texto. No exemplo abaixo, o código percorre OrderNotes (coluna E), checa se há uma vírgula no texto e, em seguida, escreve um resultado na coluna F.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' Se houver vírgula, marque
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Erros comuns com o VBA InStr
Mesmo sendo um desenvolvedor experiente, você pode enfrentar alguns problemas com InStr, que fazem seu código se comportar de forma inesperada. A seguir estão os problemas mais comuns que encontrei e como resolvê-los:
-
Esquecer que InStr é baseado em 1: lembre-se sempre de que as posições começam em 1, não em 0. Se você vem de Python ou JavaScript, isso estranha no começo.
-
Tratar InStr como True/False: lembre que
InStrnão retornaTrueouFalse. Se você quer saber se encontrou algo, precisa verificar se o resultado é> 0. -
Ignorar maiúsculas/minúsculas: como você já sabe,
InStrdiferencia maiúsculas de minúsculas por padrão. Se isso não importar, declarevbTextCompareno argumentocompare. -
Confundir string1 e string2: lembre-se sempre de que o primeiro argumento é onde você procura. O segundo é o que você está procurando. Se você buscar assim
InStr(SearchTerm, FullText), vai receber0sempre.
VBA InStr vs. outras funções de string do VBA
Como InStr normalmente mostra onde uma string está em um texto, vamos compará-la com outras funções de string.
InStr vs. Like
O operador Like é usado para correspondência por padrão. Por exemplo, o código abaixo verifica “Fragile”, mas usa o padrão *, que significa “qualquer coisa antes ou depois”.
Sub ChExist()
Dim i As Integer
' Loop pelas linhas 2 a 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Use InStr se você só precisa saber se um texto existe, e Like quando precisar verificar textos com padrões mais complexos.
InStr vs. Replace
Embora você possa usar InStr para trocar o valor inteiro de uma célula, a função Replace substitui um texto específico dentro da célula.
No exemplo abaixo, Replace troca diretamente “Fragile” por “Handle Carefully” dentro do texto.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr vs. Mid
A função Mid é usada para extrair texto de uma string. Por isso, você frequentemente vai usar Mid com InStr para extrair o texto depois de obter sua posição.
O código abaixo extrai o domínio de e-mails no conjunto de dados. InStr encontra onde o "@" aparece no e-mail e, em seguida, Mid começa a extração após ele. O código termina escrevendo o domínio na coluna H.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr vs.Split
A função Split é usada para quebrar um texto em partes especificando um separador.
No exemplo abaixo, o código lê cada linha da coluna A, verifica se há vírgula e, então, divide o texto em duas partes. Ele escreve Name → coluna B e City → coluna C.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Só divide se houver vírgula
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
Boas práticas para usar o VBA InStr
Para evitar erros no seu VBA, recomendo as seguintes boas práticas, que têm me ajudado a ganhar tempo:
-
Use vbTextCompare quando maiúsculas/minúsculas não importarem: como a maioria dos dados reais não é consistente com capitalização, você pode perder correspondências se depender do argumento
comparepadrão. -
Combine com “If” para uma lógica clara: sempre tente incluir uma lógica para retornar um valor, pois
InStrsozinho só te dá um número. -
Verifique > 0, não posições exatas, a menos que você realmente precise da posição.
-
Mantenha o parsing legível. Não empilhe funções demais em uma única linha.
Conclusão
InStr é simples, mas você vai acabar usando em todo lugar. Ela te dá a posição de uma string dentro de outra, e esse único número direciona muitas decisões no VBA: se algo existe, de onde extrair e o que a macro deve fazer em seguida. Sozinha, é apenas uma busca. Combinada com funções como Mid, Replace ou mesmo Split, vira parte de um fluxo de trabalho que realmente faz as coisas acontecerem.
Faça nosso curso Data Analysis in Excel para dominar análises avançadas. E conheça também o curso Intermediate Power Query in Excel para aprender sobre transformação de dados e uso da linguagem M.
FAQs
O que o InStr realmente retorna?
Ela retorna a posição onde a correspondência começa. Se nada for encontrado, retorna 0.
O InStr diferencia maiúsculas de minúsculas?
Sim, InStr diferencia maiúsculas de minúsculas por padrão. ”Fragile” e ”fragile” são tratados como diferentes. Use vbTextCompare se você não quiser uma comparação sensível a maiúsculas/minúsculas.
O que significa o InStr ser baseado em 1?
O primeiro caractere de uma string é a posição 1, não 0. Isso importa quando você usa o resultado em outras funções.
O que acontece se um dos valores for Null?
O resultado também será Null, não 0.
Qual é a diferença entre InStr e InStrRev?
InStr busca da esquerda para a direita, enquanto InStrRev começa da direita para a esquerda. Use o segundo quando a última ocorrência for a que importa.
