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

VBA Trim dans Excel — pourquoi il ne supprime pas vos espaces (et le correctif Chr(160))

|

VBA Trim dans Excel — pourquoi il ne supprime pas vos espaces (et le correctif Chr(160))

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 10/06/2026

En bref — Le Trim de VBA supprime les espaces aux deux extrémités d'une chaîne, et rien d'autre. Il ne réduit pas les doubles espaces à l'intérieur du texte, et il n'enlève pas l'espace insécable (Chr(160)) que les pages web et les PDF collent dans vos cellules. Ce second point est la raison pour laquelle « Trim ne fonctionne pas » est l'une des plaintes VBA les plus recherchées.

Sub TrimDemo()
    Dim s As String
    s = "   Dupont  SA   "                  ' extrémités + un DOUBLE espace au milieu

    Debug.Print "[" & Trim(s) & "]"        ' [Dupont  SA]  <- extrémités parties, double espace interne RESTE
    Debug.Print "[" & LTrim(s) & "]"       ' [Dupont  SA   ]  gauche uniquement
    Debug.Print "[" & RTrim(s) & "]"       ' [   Dupont  SA]  droite uniquement
End Sub

Pour réduire aussi les suites d'espaces à l'intérieur à un seul, il faut la fonction de feuille, pas le mot-clé VBA :

Debug.Print Application.WorksheetFunction.Trim("   Dupont  SA   ")   ' "Dupont SA"

Le modèle mental : Trim est une coupe des extrémités, pas un shampoing

Trim met les bords au propre. Il avance depuis la gauche jusqu'à rencontrer un caractère non-espace, avance depuis la droite jusqu'à rencontrer un caractère non-espace, et renvoie ce qu'il y a entre les deux. Tout ce qui est au milieu reste exactement tel quel. C'est tout son comportement — et cela explique chaque surprise.

Une fois cette image en tête, la famille se lit d'un coup d'œil : LTrim ne fait que le bord gauche, RTrim que le droit, Trim les deux. Aucun ne s'occupe de l'intérieur. Donc quand votre problème est « l'utilisateur a tapé deux espaces entre le prénom et le nom », Trim est tout simplement le mauvais outil — prenez WorksheetFunction.Trim, une fonction différente du même nom qui réduit aussi les suites internes.

La règle unique : le Trim de VBA ne supprime que l'espace ASCII Chr(32)

C'est la règle qui transforme un bug déroutant en correctif d'une ligne :

Trim ne reconnaît qu'un seul caractère comme « espace à supprimer » : l'espace ASCII ordinaire Chr(32). Tout autre caractère qui ressemble à un blanc — une tabulation, un saut de ligne et surtout l'espace insécable Chr(160) — est, pour Trim, un caractère normal qu'il doit conserver.

Voici le piège dans son habitat naturel. Vous copiez une valeur depuis une page web, un e-mail HTML ou un PDF vers Excel. Visuellement, elle se termine par un espace. Votre Trim s'exécute, la cellule ne correspond toujours pas à votre recherche, et vous perdez une heure :

Dim raw As String
raw = "Acme SARL" & Chr(160)             ' un espace insécable final, issu d'un collage web
Debug.Print Len(Trim(raw))               ' 10, pas 9 — Trim n'a rien supprimé
Debug.Print (Trim(raw) = "Acme SARL")    ' False !  les valeurs semblent identiques mais ne le sont pas

Le correctif n'est pas un Trim plus malin. C'est de transformer d'abord le Chr(160) en vrai espace, puis de trimmer :

Function CleanText(ByVal s As String) As String
    s = Replace(s, Chr(160), " ")                          ' espace insécable -> espace normal
    s = Application.WorksheetFunction.Clean(s)             ' retire les caractères de contrôle Chr(0)-Chr(31)
    CleanText = Application.WorksheetFunction.Trim(s)      ' réduit les suites internes + trimme les deux bouts
End Function

Clean mérite une mention ici : il retire les caractères de contrôle non imprimables (retours chariot, sauts de ligne, tabulations dans la plage 0–31) qui s'infiltrent depuis les exports — mais attention, il ne retire pas Chr(160), car 160 est au-dessus de cette plage. C'est pourquoi un vrai nettoyage est le trio ci-dessus, dans cet ordre, pas une fonction isolée.

Le second piège : Trim contre Trim$

Il y a deux Trim. Le Trim nu est la version Variant ; Trim$ est le jumeau typé String. Deux différences pratiques :

  • Trim$ est légèrement plus rapide et renvoie directement une String, ce qui compte dans une boucle serrée sur des milliers de cellules.
  • Trim$ lève une erreur sur Null, tandis que Trim laisse passer Null silencieusement. Quand vous lisez un Variant qui pourrait être Null (un champ de base de données, un Range.Value vide), le Trim nu est le tolérant.

Mon habitude : Trim$ dans les boucles où je contrôle les types, Trim nu à la frontière où une valeur pourrait être Null. Savoir lequel vous tenez évite une « Utilisation incorrecte de Null » surprise.

Quand utiliser quoi

Vous voulez… Utilisez
Supprimer les espaces de début et de fin Trim(s)
Un seul côté LTrim(s) / RTrim(s)
Réduire aussi les doubles espaces à l'intérieur Application.WorksheetFunction.Trim(s)
Retirer les caractères de contrôle non imprimables Application.WorksheetFunction.Clean(s)
Tuer les espaces insécables d'un collage web/PDF Replace(s, Chr(160), " ") puis Trim
Nettoyer toute une colonne vite Une fonction CleanText, appelée une fois par cellule

L'avis tranché : pas de chaînes de Trim — nettoyez une fois, à la frontière

L'anti-modèle que je vois le plus, c'est Trim saupoudré par prudence partout dans une macro — Trim(rng.Value) ici, Trim(parts(i)) là — dans l'espoir que l'un d'eux fasse enfin marcher la comparaison. Ça ne marche jamais pour Chr(160), parce qu'aucun de ces Trim ne le touche.

Nettoyer du texte est une affaire de frontière, pas de ligne par ligne. Les données arrivent sales à un seul endroit — l'import, le collage, la lecture — alors nettoyez-les , une fois, avec une unique fonction CleanText comme ci-dessus, et faites-lui confiance partout en aval. Une macro qui normalise à la frontière est lisible et correcte ; une macro avec quarante Trim éparpillés est une macro dont l'auteur devinait. Si vos comparaisons échouent encore après un vrai nettoyage, la différence n'est pas du tout un blanc — c'est un Chr(160), une casse (voir CStr / conversion de type) ou un nombre stocké en texte.

Erreurs Trim courantes (et le correctif)

Symptôme Cause Correctif
La valeur « semble trimmée » mais ne correspond pas Chr(160) final issu d'un collage web/PDF Replace(s, Chr(160), " ") avant Trim
Les doubles espaces internes restent Trim utilisé, qui ne fait que les bouts WorksheetFunction.Trim(s)
Sauts de ligne / tabulations survivent Ce sont des caractères de contrôle, pas des espaces D'abord WorksheetFunction.Clean(s)
« Utilisation incorrecte de Null » en boucle Trim$ a rencontré un Variant Null Trim nu, ou tester IsNull d'abord
Trim ne fait rien sur une cellule L'espace est en fait Chr(160) ou Chr(9) Vérifier Asc(Right(s,1)) pour voir le vrai code
Colonne toujours non concordante après Trim Nettoyage éparpillé, pas fait à l'import Un appel CleanText à la frontière de lecture

Quand le nettoyage dépasse l'objectif — décrivez plutôt la tâche

Vous ne vouliez pas étudier les espaces. Vous vouliez rapprocher l'export de la semaine de votre liste maître, et les noms ne s'alignent pas parce que la moitié est arrivée emballée dans des Chr(160). Le temps d'écrire la fonction de nettoyage, de parcourir la colonne et de traquer la ligne qui ne correspond toujours pas, la tuyauterie a mangé l'après-midi. ExcelMaster Agent vous laisse énoncer l'objectif en français courant — « nettoie les espaces et les caractères cachés de la colonne B, puis rapproche-la de la feuille maître » — et écrit du Python qui gère Chr(160), les caractères de contrôle et la casse, en sauvegardant d'abord votre classeur. Essayer gratuitement →

Guides liés

FAQ

Pourquoi mon VBA Trim ne fonctionne-t-il pas ? Presque toujours parce que l'« espace » n'en est pas un. Trim ne supprime que l'espace ASCII Chr(32). Le texte collé depuis des pages web, des e-mails HTML ou des PDF se termine souvent par un espace insécable Chr(160), que Trim conserve. Remplacez-le d'abord : Trim(Replace(s, Chr(160), " ")).

VBA Trim supprime-t-il les doubles espaces à l'intérieur d'une chaîne ? Non. Le mot-clé VBA Trim ne supprime les espaces qu'aux deux extrémités. Pour réduire les suites internes à un seul espace, utilisez plutôt la fonction de feuille : Application.WorksheetFunction.Trim(s).

Quelle est la différence entre Trim et Trim$ en VBA ? Trim renvoie un Variant et laisse passer Null inchangé ; Trim$ renvoie directement une String, est un peu plus rapide et lève une erreur sur Null. Utilisez Trim$ dans les boucles serrées aux types connus, et Trim nu là où une valeur pourrait être Null.

Comment supprimer les espaces insécables (Chr 160) en VBA ? Remplacez-les par un espace normal, puis trimmez : Application.WorksheetFunction.Trim(Replace(s, Chr(160), " ")). Ajoutez WorksheetFunction.Clean(s) pour retirer les caractères de contrôle comme les sauts de ligne et tabulations dans la même passe.

Que fait VBA Clean, et est-ce la même chose que Trim ? Non. Clean retire les caractères de contrôle non imprimables (codes 0–31, comme les sauts de ligne et tabulations) ; Trim retire les espaces. Ils résolvent des problèmes différents et sont souvent utilisés ensemble. Notez que Clean ne retire pas Chr(160), car 160 est hors de la plage des caractères de contrôle.