programa
Si has escrito más de un par de macros en VBA, seguro que te has visto en esa situación en la que necesitas comprobar si un texto existe dentro de una celda. En VBA, InStr es una de esas funciones que terminas usando en todas partes. Te dice en qué posición aparece un texto dentro de otro. Puedes usarla para comprobar si un texto existe en una celda, analizar valores dentro de un texto o ejecutar lógica condicional en macros que dependen de patrones de texto.
En esta guía, te explico la sintaxis de InStr, varios ejemplos, cómo funcionan los modos de comparación (esta parte da más guerra de la que debería) y algunos patrones que realmente vas a reutilizar.
Te recomiendo empezar por nuestro itinerario de aprendizaje Excel Fundamentals para construir una base sólida antes de pasar a VBA, o hacer nuestro curso Advanced Excel Functions si ya tienes algo de experiencia, para aprender cómo las funciones mejoran la eficiencia en el análisis de datos.
¿Qué es la función InStr de VBA?
InStr es una función de VBA que devuelve la posición de la primera ocurrencia de una cadena dentro de otra.
Los resultados se comportan así:
- Si la encuentra, devuelve un número (la posición donde empieza la coincidencia)
- Si no encuentra nada, devuelve 0
Por ejemplo, si «cat» aparece en la posición 5 de una cadena, obtienes 5. Si no está, obtienes 0.
Sintaxis de InStr en VBA
Esta es la sintaxis completa de InStr:
InStr([start], string1, string2, [compare])
Donde:
-
start(opcional): Indica a VBA desde dónde empezar la búsqueda. Si lo omites, VBA empieza en la posición 1. -
string1(obligatorio): El texto completo en el que buscas. -
string2(obligatorio): El texto que intentas encontrar. -
compare(opcional): Define cómo se realiza la comparación (si distingue mayúsculas/minúsculas o no). Si lo dejas en blanco, VBA usa el modo por defecto, normalmente sensible a mayúsculas.
Ten en cuenta que puedes ignorar los argumentos start y compare (InStr(string1, string2)) para una versión más simple. Pero si decides usar el argumento compare, también debes proporcionar el argumento start.
Cómo funciona InStr en VBA
Piensa en InStr como leer una frase de izquierda a derecha, carácter a carácter.
La función empieza con string1, lo recorre y busca el primer lugar donde string2 coincide. En cuanto encuentra esa coincidencia, se detiene y devuelve la posición donde comenzó.
La posición de la «coincidencia» es importante porque VBA cuenta desde 1, no desde 0. Así, el primer carácter de una cadena es la posición 1, el segundo es 2, y así sucesivamente.
Valores de retorno de InStr en VBA
Interpretar el resultado de InStr es directo. Puedes obtener:
-
Un número positivo: si encuentra una coincidencia; el número indica dónde empieza.
-
0: si no hay coincidencia en ningún punto de la cadena
Sin embargo, si tus cadenas de entrada son Null, la función devuelve Null. Aunque en macros básicas puedes pasarlo por alto, conviene saberlo porque esa diferencia puede romper una condición sin que te des cuenta.
Ejemplos básicos de InStr en VBA
Ahora te muestro algunos ejemplos de cómo usar la función InStr de VBA.
Encontrar una palabra en una frase
Para comprobar si la palabra «before» está dentro de la nota «Deliver before noon».
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
El resultado del VBA anterior es 9 ya que «before» empieza en el carácter 9.
Comprobar si existe un carácter
Para comprobar si el carácter «0» existe en una cadena dada, usa este VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
En este caso, cualquier resultado mayor que 0 significa que el carácter se ha encontrado.
Buscar desde el inicio de una cadena
Para buscar desde el principio de una cadena, no necesitas especificar la posición de inicio; comienza en 1. Ese es el valor por defecto salvo que digas lo contrario.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Cómo usar InStr de VBA en sentencias If
Cuando trabajas con una hoja real, no solo buscas un número; intentas tomar una decisión. La forma más común de usar InStr es dentro de una sentencia If para filtrar datos.
En todo este tutorial, usaremos un conjunto de datos de ejemplo, Orders, con las columnas: ID, CustomerName, Email, City y OrderNotes.
If InStr(...) > 0 Then
Como InStr devuelve 0 cuando no encuentra nada, comprobamos si hay resultado cuando devuelve un número mayor que 0.
En el ejemplo siguiente, mira la columna OrderNotes (columna 5). Si encuentra la palabra «Fragile», escribe «Handle Carefully» en la columna 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Comprobaciones condicionales por palabras clave y filtrado de texto
También puedes usar InStr para buscar palabras clave en cadenas, sobre todo si la frase cambia ligeramente. Por ejemplo, el código de abajo comprueba si la nota contiene «Call» (como «Call on arrival» o «Call before delivery»). Luego marca y añade la etiqueta «Call Customer» en la columna 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
Distinguir mayúsculas y modos de comparación en InStr de VBA
Por defecto, InStr distingue mayúsculas y minúsculas (modo vbBinaryCompare). Si buscas «chicago» pero los datos ponen «Chicago», InStr devolverá 0.
Para solucionarlo, usa el argumento compare, donde:
-
vbBinaryCompare(por defecto): distingue mayúsculas («A» no es lo mismo que «a») -
vbTextCompare: no distingue mayúsculas («A» es lo mismo que «a»)
En el ejemplo siguiente, InStr devuelve 0 porque busca «fragile» (minúsculas) dentro de «Fragile items».
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
En cambio, usando vbTextCompare devuelve 1 con la misma búsqueda porque ignora las mayúsculas.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
InStr de VBA con posición inicial
A veces no quieres empezar la búsqueda al principio de la cadena. El argumento start indica a VBA dónde comenzar.
En el ejemplo de abajo, el argumento start se establece en 10, así que VBA empieza a buscar desde el carácter 10 en lugar del primero. Luego encuentra "delivery" más adelante en la cadena.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
El resultado del ejemplo anterior es 31, que es la posición donde empieza "delivery".
Este método es útil cuando quieres la segunda ocurrencia de algo o ignorar un prefijo conocido al trabajar con patrones repetidos.
InStr de VBA vs. InStrRev
Como ya has visto, InStr busca de izquierda a derecha. En cambio, InStrRev busca de derecha a izquierda.
Por ejemplo, hemos usado InStrRev para encontrar el último punto en el email. El resultado es 18, que es la posición del punto antes de «com».
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev te resultará más útil cuando necesites la última ocurrencia de algo o cuando trabajes con nombres de archivo, emails o rutas.
Casos de uso comunes de InStr en VBA
Ahora que hemos visto ejemplos de cómo funciona InStr en VBA, veamos los casos de uso más habituales.
Comprobar si una celda contiene una palabra clave
Imagina que tienes un dataset de pedidos de clientes y necesitas marcar pedidos para un tratamiento específico. El código mira la columna OrderNotes y marca cualquier cosa con «noon».
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
Validar texto con formato de email
También puedes usar InStr para comprobar rápidamente formatos de email válidos. Por ejemplo, el código de abajo verifica si el email contiene @ y escribe «Valid Email Format» en la columna 6.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 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 comas o guiones
Puedes usar InStr para comprobar si hay guiones, comas o barras en un texto. En el ejemplo siguiente, el código recorre OrderNotes (columna E), comprueba si hay una coma en el texto y luego escribe un resultado en la columna 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, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Errores comunes con InStr en VBA
Incluso con experiencia, puedes encontrarte con problemas al usar InStr que hacen que tu código se comporte de forma inesperada. Estos son los fallos más comunes que me he encontrado y cómo resolverlos:
-
Olvidar que InStr empieza en 1: recuerda siempre que las posiciones comienzan en 1, no en 0. Si vienes de Python o JavaScript, al principio choca.
-
Tratar InStr como True/False: recuerda que
InStrno devuelveTrueoFalse. Si quieres saber si encuentra algo, debes comprobar si el resultado es> 0. -
Ignorar las mayúsculas/minúsculas: como ya sabes,
InStrdistingue mayúsculas por defecto. Si no te importa, indícalo convbTextCompareen el argumentocompare. -
Confundir string1 y string2: recuerda siempre que el primer argumento es dónde buscas. El segundo es lo que buscas. Si buscas así
InStr(SearchTerm, FullText), siempre obtendrás0.
InStr de VBA frente a otras funciones de cadena de VBA
Como InStr suele indicar dónde está una cadena dentro de un texto, compáremosla con otras funciones de texto.
InStr vs. Like
El operador Like se usa para coincidir patrones. Por ejemplo, el código de abajo comprueba «Fragile», pero usa el patrón *, que significa «cualquier cosa antes o después».
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 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
Usa InStr si solo necesitas saber si un texto existe, y Like cuando necesites comprobar texto con patrones complejos.
InStr vs. Replace
Aunque puedes usar InStr para cambiar el valor completo de una celda, la función Replace cambia un texto específico dentro de la celda.
En el ejemplo de abajo, Replace sustituye directamente «Fragile» por «Handle Carefully» dentro del 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
La función Mid se usa para extraer texto de una cadena. Por eso, a menudo usarás Mid junto con InStr para extraer el texto tras obtener su posición.
El código siguiente extrae el dominio de los emails del dataset. InStr encuentra dónde aparece "@" en el email y luego Mid empieza a extraer a partir de ahí. El código termina escribiendo el dominio en la columna 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
La función Split se usa para dividir un texto en partes indicando un separador.
En el ejemplo siguiente, el código lee cada fila de la columna A, comprueba si hay una coma y luego divide el texto en dos partes. Escribe Name → columna B y City → columna 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
' Only split if a comma exists
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
Buenas prácticas al usar InStr en VBA
Para evitar errores en tu VBA, te recomiendo estas buenas prácticas que me han ahorrado mucho tiempo:
-
Usa vbTextCompare cuando no importe las mayúsculas: como la mayoría de los datos reales no son consistentes con las mayúsculas, puedes perder coincidencias si dependes del argumento de comparación por defecto.
-
Combínalo con «If» para una lógica clara: intenta devolver siempre un valor, ya que
InStrpor sí sola solo te da un número. -
Comprueba > 0, no posiciones exactas, salvo que realmente necesites la posición.
-
Mantén legible el análisis. No encadenes demasiadas funciones en una sola línea.
Conclusión
InStr es sencilla, pero acabarás usándola por todas partes. Te da la posición de una cadena dentro de otra, y ese único número impulsa muchas decisiones en VBA: si algo existe, desde dónde extraer y qué debe hacer la macro a continuación. Por sí sola, es solo una búsqueda. Combinada con funciones como Mid, Replace o incluso Split, forma parte de un flujo de trabajo que realmente te ayuda a sacar trabajo adelante.
Haz nuestro curso Data Analysis in Excel para dominar analítica avanzada. Además, haz nuestro Intermediate Power Query in Excel para aprender sobre transformación de datos y el uso del lenguaje M.
FAQs
¿Qué devuelve exactamente InStr?
Devuelve la posición donde empieza la coincidencia. Si no encuentra nada, devuelve 0.
¿InStr distingue mayúsculas y minúsculas?
Sí, InStr distingue mayúsculas por defecto. ”Fragile” y ”fragile” se tratan como distintos. Usa vbTextCompare si no quieres una comparación sensible a mayúsculas.
¿Qué significa que InStr es 1-based?
El primer carácter de una cadena es la posición 1, no 0. Esto importa cuando usas el resultado en otras funciones.
¿Qué pasa si uno de los valores es Null?
El resultado también será Null, no 0.
¿Cuál es la diferencia entre InStr e InStrRev?
InStr busca de izquierda a derecha, mientras que InStrRev empieza de derecha a izquierda. Usa la segunda cuando te importe la última ocurrencia.
