Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación el 10/06/2026
Resumen — El Trim de VBA elimina los espacios de los dos extremos de una cadena, y nada más. No reduce los espacios dobles del interior del texto, y no elimina el espacio de no separación (Chr(160)) que las páginas web y los PDF pegan en tus celdas. Ese segundo hecho es la razón por la que «Trim no funciona» es una de las quejas de VBA más buscadas.
Sub TrimDemo()
Dim s As String
s = " García S.A. " ' extremos + un espacio DOBLE en medio
Debug.Print "[" & Trim(s) & "]" ' [García S.A.] <- extremos fuera, doble espacio interno SE QUEDA
Debug.Print "[" & LTrim(s) & "]" ' [García S.A. ] solo a la izquierda
Debug.Print "[" & RTrim(s) & "]" ' [ García S.A.] solo a la derecha
End Sub
Para reducir también las rachas de espacios del interior a uno solo, necesitas la función de hoja, no la palabra clave de VBA:
Debug.Print Application.WorksheetFunction.Trim(" García S.A. ") ' "García S.A."
El modelo mental: Trim es un corte de las puntas, no un lavado
Trim ordena los bordes. Entra desde la izquierda hasta topar con un carácter que no es espacio, entra desde la derecha hasta topar con un carácter que no es espacio, y devuelve lo que hay en medio. Todo lo del centro queda exactamente como estaba. Ese es todo su comportamiento — y explica cada sorpresa.
Con esa imagen en la cabeza, la familia se lee de un vistazo: LTrim es solo el borde izquierdo, RTrim solo el derecho, Trim ambos. Ninguno se ocupa del interior. Así que cuando tu problema es «el usuario escribió dos espacios entre el nombre y el apellido», Trim es sencillamente la herramienta equivocada — usa WorksheetFunction.Trim, una función distinta con el mismo nombre que también colapsa las rachas internas.
La regla única: el Trim de VBA solo elimina el espacio ASCII Chr(32)
Esta es la regla que convierte un error desconcertante en un arreglo de una línea:
Trimreconoce exactamente un carácter como «espacio a eliminar»: el espacio ASCII normalChr(32). Cualquier otro carácter con aspecto de blanco — una tabulación, un salto de línea y, sobre todo, el espacio de no separaciónChr(160)— es, paraTrim, un carácter normal que debe conservar.
Aquí está la trampa en su hábitat natural. Copias un valor desde una página web, un correo HTML o un PDF a Excel. Visualmente termina con un espacio. Tu Trim se ejecuta, la celda sigue sin coincidir con tu búsqueda, y pierdes una hora:
Dim raw As String
raw = "García S.A." & Chr(160) ' un espacio de no separación final, de un pegado web
Debug.Print Len(Trim(raw)) ' 11, no 10 — Trim no eliminó nada
Debug.Print (Trim(raw) = "García S.A.") ' ¡False! los valores parecen idénticos pero no lo son
El arreglo no es un Trim más listo. Es convertir primero el Chr(160) en un espacio de verdad y luego recortar:
Function CleanText(ByVal s As String) As String
s = Replace(s, Chr(160), " ") ' espacio de no separación -> espacio normal
s = Application.WorksheetFunction.Clean(s) ' quita caracteres de control Chr(0)-Chr(31)
CleanText = Application.WorksheetFunction.Trim(s) ' colapsa rachas internas + recorta ambos extremos
End Function
Clean merece una mención aquí: elimina los caracteres de control no imprimibles (retornos de carro, saltos de línea, tabulaciones en el rango 0–31) que se cuelan desde las exportaciones — pero ojo, no elimina Chr(160), porque 160 está por encima de ese rango. Por eso una limpieza real es el trío de arriba, en ese orden, no una función suelta.
La segunda trampa: Trim frente a Trim$
Hay dos Trim. El Trim pelado es la versión Variant; Trim$ es el gemelo tipado String. Dos diferencias prácticas:
Trim$es algo más rápido y devuelve directamente unString, lo que importa en un bucle apretado sobre miles de celdas.Trim$lanza un error conNull, mientras queTrimdeja pasarNullen silencio. Cuando lees unVariantque podría serNull(un campo de base de datos, unRange.Valuevacío), elTrimpelado es el tolerante.
Mi costumbre: Trim$ en bucles donde controlo los tipos, Trim pelado en la frontera donde un valor podría ser Null. Saber cuál tienes en la mano evita un sorpresivo «Uso no válido de Null».
Cuándo usar cuál
| Quieres… | Usa |
|---|---|
| Quitar espacios iniciales y finales | Trim(s) |
| Solo un lado | LTrim(s) / RTrim(s) |
| Colapsar también los espacios dobles del interior | Application.WorksheetFunction.Trim(s) |
| Quitar caracteres de control no imprimibles | Application.WorksheetFunction.Clean(s) |
| Matar espacios de no separación de web/PDF | Replace(s, Chr(160), " ") y luego Trim |
| Limpiar una columna entera rápido | Una función CleanText, llamada una vez por celda |
La opinión: nada de cadenas de Trim — normaliza una vez, en la frontera
El antipatrón que más veo es Trim espolvoreado a la defensiva por toda la macro — Trim(rng.Value) aquí, Trim(parts(i)) allá — con la esperanza de que uno de ellos haga funcionar por fin la comparación. Nunca funciona con Chr(160), porque ninguno de esos Trim lo toca.
Limpiar texto es un asunto de frontera, no de línea por línea. Los datos entran sucios en un único sitio — la importación, el pegado, la lectura — así que límpialos ahí, una vez, con una sola función CleanText como la de arriba, y confía en ella en todo lo de aguas abajo. Una macro que normaliza en la frontera es legible y correcta; una macro con cuarenta Trim desperdigados es una macro cuyo autor estaba adivinando. Si tus comparaciones siguen fallando tras una limpieza real, la diferencia no es espacio en absoluto — es un Chr(160), una diferencia de mayúsculas (ver CStr / conversión de tipo) o un número guardado como texto.
Errores frecuentes de Trim (y el arreglo)
| Síntoma | Causa | Arreglo |
|---|---|---|
| El valor «parece recortado» pero no coincide | Chr(160) final de un pegado web/PDF |
Replace(s, Chr(160), " ") antes de Trim |
| Los espacios dobles internos se quedan | Se usó Trim, que solo hace los extremos |
WorksheetFunction.Trim(s) |
| Sobreviven saltos de línea / tabulaciones | Son caracteres de control, no espacios | Primero WorksheetFunction.Clean(s) |
| «Uso no válido de Null» en un bucle | Trim$ topó con un Variant Null |
Trim pelado, o probar IsNull antes |
| Trim no hace nada en una celda | El espacio en realidad es Chr(160) o Chr(9) |
Comprobar Asc(Right(s,1)) para ver el código real |
| La columna entera sigue sin coincidir tras Trim | Limpieza desperdigada, no hecha al importar | Una llamada CleanText en la frontera de lectura |
Cuando la limpieza supera el objetivo — describe la tarea en su lugar
No te propusiste estudiar los espacios. Te propusiste cruzar la exportación de esta semana con tu lista maestra, y los nombres no cuadran porque la mitad llegó envuelta en Chr(160). Para cuando has escrito la función de limpieza, recorrido la columna y perseguido la única fila que aún no coincide, la fontanería se ha comido la tarde. ExcelMaster Agent te deja enunciar el objetivo en español sencillo — «limpia los espacios y caracteres ocultos de la columna B y luego crúzala con la hoja maestra» — y escribe Python que se encarga de Chr(160), los caracteres de control y las mayúsculas, haciendo antes una copia de seguridad de tu libro. Prueba gratis →
Guías relacionadas
- VBA Format — fechas, números y por qué el formato rompe tus cálculos
- VBA CStr, CDate y Val — convertir texto a números y fechas correctamente
- VBA InStr — encontrar texto dentro de una cadena
- VBA Split — convertir una cadena en una matriz
- Bucle For en VBA — 8 ejemplos del mundo real
Preguntas frecuentes
¿Por qué no funciona mi VBA Trim?
Casi siempre porque el «espacio» no lo es. Trim solo elimina el espacio ASCII Chr(32). El texto pegado desde páginas web, correos HTML o PDF termina a menudo con un espacio de no separación Chr(160), que Trim conserva. Sustitúyelo primero: Trim(Replace(s, Chr(160), " ")).
¿VBA Trim elimina los espacios dobles del interior de una cadena?
No. La palabra clave Trim de VBA solo elimina los espacios de los dos extremos. Para reducir las rachas internas a un solo espacio, usa en su lugar la función de hoja: Application.WorksheetFunction.Trim(s).
¿Cuál es la diferencia entre Trim y Trim$ en VBA?
Trim devuelve un Variant y deja pasar Null sin cambios; Trim$ devuelve directamente un String, es algo más rápido y lanza un error con Null. Usa Trim$ en bucles apretados con tipos conocidos, y Trim pelado donde un valor podría ser Null.
¿Cómo elimino los espacios de no separación (Chr 160) en VBA?
Sustitúyelos por un espacio normal y luego recorta: Application.WorksheetFunction.Trim(Replace(s, Chr(160), " ")). Añade WorksheetFunction.Clean(s) para quitar caracteres de control como saltos de línea y tabulaciones en la misma pasada.
¿Qué hace VBA Clean, y es lo mismo que Trim?
No. Clean elimina caracteres de control no imprimibles (códigos 0–31, como saltos de línea y tabulaciones); Trim elimina espacios. Resuelven problemas distintos y a menudo se usan juntos. Ten en cuenta que Clean no elimina Chr(160), ya que 160 está fuera del rango de caracteres de control.
