🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Replace en Excel — Sustituir texto y las trampas de sus argumentos

|

VBA Replace en Excel — Sustituir texto y las trampas de sus argumentos

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · verificado por última vez el 09-06-2026

En resumenReplace encuentra una subcadena y la cambia por otra — cada aparición, en una sola pasada. Es el Ctrl+H escrito en código, y devuelve una cadena nueva en lugar de cambiar la original:

Sub ReplaceDemo()
    Dim s As String
    s = "2026-04-01"
    Debug.Print Replace(s, "-", "/")     ' 2026/04/01   <- TODOS los guiones, una llamada
    Debug.Print s                        ' 2026-04-01   <- el original queda intacto
End Sub

La firma completa, donde está el problema:

Replace(expression, find, replace, [start], [count], [compare])
'                                    ⚠ trampas    vbTextCompare = ignora mayúsculas

El modelo mental: es Ctrl+H, no "cambia el primero"

Cuando pulsas Ctrl+H en Excel y eliges "Reemplazar todo", cambia cada coincidencia a la vez. La función Replace de VBA hace exactamente eso, por defecto — no hay un modo "buscar siguiente, pregúntame". Le das una cadena y devuelve una copia con todas las apariciones cambiadas.

Dos cosas se desprenden directamente de ese modelo. Primera, no toca la variable original — Replace es una función que devuelve el resultado, así que debes capturarlo (s = Replace(s, …)). Segunda, como lo cambia todo, Replace es la herramienta adecuada para transformaciones generales — normalizar todos los separadores, quitar todos los $, cambiar todos los "N/A" por "" — y la equivocada cuando solo quieres cambiar una concreta. Volveremos a eso, porque la vía de "cambiar solo la primera" es donde los argumentos de Replace se vuelven una trampa de pérdida de datos.

La regla de oro: Replace distingue mayúsculas por defecto

Esta es la regla detrás de la mitad de las preguntas de "mi Replace no hace nada" en internet:

Por defecto, Replace compara con vbBinaryCompare — coincidencia exacta de mayúsculas. Replace("Hello", "h", "J") devuelve "Hello" sin cambios, porque una H mayúscula no es una h minúscula.

Para coincidir sin importar las mayúsculas, debes pasar el sexto argumento explícitamente:

Debug.Print Replace("Hello", "h", "J")                      ' Hello   (¡sin coincidencia!)
Debug.Print Replace("Hello", "h", "J", , , vbTextCompare)   ' Jello   (coincidió la H)

Fíjate en las dos comas vacías — estás saltándote start y count para llegar a compare. Esa incomodidad es una pista del lenguaje: esos argumentos intermedios suelen ser de los que conviene no tocar. Lo que nos lleva a la trampa de verdad.

La trampa que se come tus datos: start trunca el resultado

Todos leen el argumento start como "empezar a buscar desde esta posición". Eso hace — y además descarta todo lo anterior. La cadena que devuelve Replace empieza en start:

Debug.Print Replace("ABCDEF", "C", "x", 3)
' Esperas: "ABxDEF"
' Obtienes: "xDEF"        <- "AB" SE FUE

Empezar en la posición 3 significa que el valor devuelto empieza en el carácter 3 ("CDEF"), con el reemplazo aplicado → "xDEF". Los dos primeros caracteres no se saltan conservándolos — se descartan por completo de la salida. En un caso suelto es obvio; enterrado en una función que procesa 50.000 celdas, acorta en silencio cada valor y te enteras cuando los totales no cuadran.

El argumento count (número máximo de reemplazos) es menos destructivo, pero interactúa con start justo del modo que no quieres cuando tu objetivo real es "solo la primera". La regla honesta: deja start y count en sus valores por defecto. Si de verdad necesitas reemplazar solo la primera aparición, no recurras a count — localízala con InStr y reconstruye con Mid:

' Reemplazar solo el PRIMER "-" sin perder el prefijo
pos = InStr(s, "-")
If pos > 0 Then s = Left(s, pos - 1) & "/" & Mid(s, pos + 1)

Más código que Replace(s, "-", "/", , 1) — pero no se come el principio de tu cadena.

El otro Replace: Range.Replace cambia la hoja, no una cadena

Hay dos "Replace" completamente distintos en VBA de Excel, y confundirlos cuesta horas. La función (Replace(...)) transforma una cadena en memoria. El método (Range.Replace ...) es Buscar y reemplazar sobre la propia hoja:

' Método — reescribe celdas directamente, columna entera en una llamada, sin bucle
Columns("B").Replace What:="N/A", Replacement:="", _
                     LookAt:=xlWhole, MatchCase:=False

Si tu objetivo es "cambiar este texto a través de un rango de celdas", no llames a la función de cadena celda por celda en un bucle. Range.Replace hace el rango entero de una vez y es muchísimo más rápido en hojas grandes. Recurre a la función de cadena solo cuando manipulas un valor que ya tienes en una variable.

La opinión: esos argumentos opcionales son trampas, no funciones

El Replace de VBA tiene seis parámetros, y el diseño te dice en voz baja que uses tres. expression, find, replace — sí. compare — a veces, cuando importan las mayúsculas. start y count — casi nunca, porque su comportamiento (truncar el resultado, interacción incómoda) sorprende a todos y corrompe datos en silencio.

Mi regla práctica: si estás tecleando el cuarto o quinto argumento de Replace, párate y pregúntate si en realidad quieres InStr + Mid. Nueve de cada diez veces querías "reemplazar la primera aparición" o "reemplazar a partir de aquí", y la cirugía por posición es más clara y segura. La llamada de dos comas saltadas con vbTextCompare es la única forma "avanzada" de Replace que vale la pena tener en la memoria muscular.

Cuándo usar cuál

Quieres… Usa Cuidado con
Cambiar cada aparición en una cadena Replace(s, a, b) Captura el retorno: s = Replace(...)
Lo mismo, pero sin distinguir mayúsculas Replace(s, a, b, , , vbTextCompare) Dos comas vacías para saltar start/count
Reemplazar texto en celdas de la hoja Range.Replace What:=… Un método, no la función — sin bucle
Reemplazar solo la primera aparición InStr + Left/Mid count/start truncan o sorprenden
Eliminar una subcadena por completo Replace(s, basura, "") Reemplazar con cadena vacía

Errores comunes con Replace (y su solución)

Síntoma Causa Solución
Replace "no hizo nada" Diferencia de mayúsculas (por defecto las distingue) Añade vbTextCompare como 6.º argumento
La cadena original sin cambios No capturaste el valor de retorno s = Replace(s, …) — devuelve una copia
A la salida le faltan los primeros caracteres Usaste el argumento start Quita start; trunca el resultado
Reemplazó todas, querías solo una Replace cambia todas por defecto InStr + Mid para apuntar a la primera
Lento en una hoja grande Hiciste un bucle de la función por cada celda Usa Range.Replace una vez sobre el rango
"Argumento no opcional" Olvidaste find o replace Los tres primeros argumentos son obligatorios

Cuando la limpieza de texto se vuelve el trabajo — describe el resultado

Un Replace es trivial. Una limpieza de verdad es una pila de ellos — quitar el $, cambiar los separadores de miles, normalizar "N/A", arreglar los guiones de fecha, recortar el resto — aplicados sobre una hoja, en el orden correcto, sin destrozar valores que contienen legítimamente un signo de dólar. ExcelMaster Agent te deja describir el estado final — "limpia la columna C: quita los símbolos de moneda, vacía los N/A, estandariza el formato de fecha" — y genera Python que lo hace con seguridad y respalda tu archivo primero, sin sorpresas del argumento start. Pruébalo gratis →

Guías relacionadas

Preguntas frecuentes

¿Qué hace Replace en VBA? La función Replace devuelve una copia de una cadena con cada aparición de una subcadena cambiada por otra. Replace("a-b-c", "-", "/") devuelve "a/b/c". No cambia la variable original — debes reasignar el resultado.

¿Por qué mi VBA Replace no funciona / no reemplaza nada? La causa más común son las mayúsculas. Por defecto Replace distingue mayúsculas (vbBinaryCompare), así que Replace("Hello", "h", "J") no encuentra coincidencia. Pasa vbTextCompare como sexto argumento para coincidir sin importar las mayúsculas. La segunda causa más común es olvidar capturar el valor de retorno.

¿Cómo hago que VBA Replace ignore mayúsculas y minúsculas? Añade vbTextCompare como argumento compare: Replace(s, find, repl, , , vbTextCompare). Las dos comas vacías saltan los argumentos start y count, que normalmente deberías dejar en sus valores por defecto.

¿Por qué VBA Replace corta el principio de mi cadena? Porque pasaste el argumento start. Replace devuelve una cadena que empieza en start — todo lo anterior a esa posición se descarta, no se conserva. Para reemplazar dentro de una cadena sin perder el prefijo, omite start o usa InStr + Mid.

¿Cuál es la diferencia entre Replace y Range.Replace? Replace(...) es una función que transforma una cadena en memoria. Range.Replace ... es un método que realiza Buscar y reemplazar directamente sobre celdas de la hoja a lo largo de un rango entero en una llamada. Usa el método para editar la hoja; la función para editar una variable de cadena.