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

VBA Trim en Excel — por qué no elimina tus espacios (y la solución Chr(160))

|

VBA Trim en Excel — por qué no elimina tus espacios (y la solución Chr(160))

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:

Trim reconoce exactamente un carácter como «espacio a eliminar»: el espacio ASCII normal Chr(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ón Chr(160) — es, para Trim, 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 un String, lo que importa en un bucle apretado sobre miles de celdas.
  • Trim$ lanza un error con Null, mientras que Trim deja pasar Null en silencio. Cuando lees un Variant que podría ser Null (un campo de base de datos, un Range.Value vacío), el Trim pelado 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

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.