Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · verificado por última vez el 09-06-2026
En resumen — Replace 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,
Replacecompara convbBinaryCompare— coincidencia exacta de mayúsculas.Replace("Hello", "h", "J")devuelve"Hello"sin cambios, porque unaHmayúscula no es unahminú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
- VBA Split — Convierte una cadena en un array
- VBA Mid, Left y Right — Extraer una subcadena por posición
- VBA InStr — Encontrar texto dentro de una cadena
- Bucle For en VBA — 8 ejemplos del mundo real
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.
