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

VBA Trim in Excel — warum es deine Leerzeichen nicht entfernt (und der Chr(160)-Fix)

|

VBA Trim in Excel — warum es deine Leerzeichen nicht entfernt (und der Chr(160)-Fix)

Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 10.06.2026

Kurzfassung — Das VBA-Trim entfernt Leerzeichen an den beiden Enden einer Zeichenkette, sonst nichts. Es fasst keine doppelten Leerzeichen im Inneren zusammen, und es entfernt nicht das geschützte Leerzeichen (Chr(160)), das Webseiten und PDFs beim Einfügen hinterlassen. Genau diese zweite Tatsache ist der Grund, warum „Trim funktioniert nicht" zu den meistgesuchten VBA-Problemen gehört.

Sub TrimDemo()
    Dim s As String
    s = "   Müller  AG   "                  ' Enden + ein DOPPELtes Leerzeichen in der Mitte

    Debug.Print "[" & Trim(s) & "]"        ' [Müller  AG]  <- Enden weg, inneres Doppel-Leerzeichen BLEIBT
    Debug.Print "[" & LTrim(s) & "]"       ' [Müller  AG   ]  nur links
    Debug.Print "[" & RTrim(s) & "]"       ' [   Müller  AG]  nur rechts
End Sub

Um auch die Leerzeichenfolgen im Inneren auf eines zu reduzieren, brauchst du die Tabellenfunktion, nicht das VBA-Schlüsselwort:

Debug.Print Application.WorksheetFunction.Trim("   Müller  AG   ")   ' "Müller AG"

Das Denkmodell: Trim ist ein Haarschnitt für die Enden, kein Shampoo

Trim macht die Ränder ordentlich. Es läuft von links hinein, bis es auf ein Nicht-Leerzeichen trifft, läuft von rechts hinein, bis es auf ein Nicht-Leerzeichen trifft, und gibt zurück, was dazwischen liegt. Alles in der Mitte bleibt exakt, wie es war. Das ist das gesamte Verhalten — und es erklärt jede Überraschung.

Hast du dieses Bild im Kopf, ist die Familie auf einen Blick klar: LTrim ist nur der linke Rand, RTrim nur der rechte, Trim beide. Keines davon kümmert sich um das Innere. Wenn dein Problem also „der Nutzer hat zwei Leerzeichen zwischen Vor- und Nachnamen getippt" lautet, ist Trim schlicht das falsche Werkzeug — nimm WorksheetFunction.Trim, eine andere Funktion mit demselben Namen, die auch innere Folgen zusammenfasst.

Die eine Regel: VBA-Trim entfernt nur das ASCII-Leerzeichen Chr(32)

Das ist die Regel, die aus einem rätselhaften Bug einen Einzeiler macht:

Trim erkennt genau ein Zeichen als „zu entfernendes Leerzeichen": das gewöhnliche ASCII-Leerzeichen Chr(32). Jedes andere leerzeichenähnliche Zeichen — ein Tabulator, ein Zeilenumbruch und vor allem das geschützte Leerzeichen Chr(160) — ist für Trim ein ganz normales Zeichen, das es behalten muss.

Hier die Falle in ihrer natürlichen Umgebung. Du kopierst einen Wert von einer Webseite, aus einer HTML-Mail oder einem PDF nach Excel. Optisch endet er mit einem Leerzeichen. Dein Trim läuft, die Zelle passt trotzdem nicht zu deinem Verweis, und eine Stunde ist weg:

Dim raw As String
raw = "Acme GmbH" & Chr(160)             ' ein geschütztes Leerzeichen am Ende, aus einem Web-Paste
Debug.Print Len(Trim(raw))               ' 10, nicht 9 — Trim hat nichts entfernt
Debug.Print (Trim(raw) = "Acme GmbH")    ' False!  die Werte sehen gleich aus, sind es aber nicht

Die Lösung ist kein clevereres Trim. Sie besteht darin, das Chr(160) zuerst in ein echtes Leerzeichen zu verwandeln und dann zu trimmen:

Function CleanText(ByVal s As String) As String
    s = Replace(s, Chr(160), " ")                          ' geschütztes -> normales Leerzeichen
    s = Application.WorksheetFunction.Clean(s)             ' Steuerzeichen Chr(0)-Chr(31) entfernen
    CleanText = Application.WorksheetFunction.Trim(s)      ' innere Folgen kürzen + beide Enden trimmen
End Function

Clean verdient hier eine Erwähnung: Es entfernt die nicht druckbaren Steuerzeichen (Wagenrückläufe, Zeilenvorschübe, Tabulatoren im Bereich 0–31), die aus Exporten einsickern — aber Achtung, es entfernt nicht Chr(160), denn 160 liegt über diesem Bereich. Deshalb ist eine echte Bereinigung das Trio oben, in dieser Reihenfolge, nicht eine einzelne Funktion.

Die zweite Falle: Trim gegen Trim$

Es gibt zwei Trims. Das nackte Trim ist die Variant-Version; Trim$ ist der typisierte String-Zwilling. Zwei praktische Unterschiede:

  • Trim$ ist minimal schneller und liefert direkt einen String zurück — wichtig in einer engen Schleife über Tausende von Zellen.
  • Trim$ löst bei Null einen Fehler aus, während Trim Null stillschweigend durchreicht. Wenn du aus einem Variant liest, das Null sein könnte (ein Datenbankfeld, ein leeres Range.Value), ist das nackte Trim das nachsichtige.

Meine Gewohnheit: Trim$ in Schleifen, in denen ich die Typen kontrolliere, nacktes Trim an der Grenze, wo ein Wert Null sein könnte. Zu wissen, welches du in der Hand hältst, erspart ein überraschendes „Unzulässige Verwendung von Null".

Wann was

Du willst… Nimm
Führende und abschließende Leerzeichen entfernen Trim(s)
Nur eine Seite LTrim(s) / RTrim(s)
Auch doppelte Leerzeichen im Inneren kürzen Application.WorksheetFunction.Trim(s)
Nicht druckbare Steuerzeichen entfernen Application.WorksheetFunction.Clean(s)
Geschützte Leerzeichen aus Web/PDF töten Replace(s, Chr(160), " ") dann Trim
Eine ganze Spalte schnell säubern Eine CleanText-Funktion, einmal pro Zelle

Die Meinung: keine Trim-Ketten — einmal an der Grenze bereinigen

Das Anti-Muster, das ich am häufigsten sehe, ist Trim, defensiv über das ganze Makro verstreut — Trim(rng.Value) hier, Trim(parts(i)) dort — in der Hoffnung, dass eines davon den Vergleich endlich funktionieren lässt. Bei Chr(160) gelingt das nie, weil keines dieser Trims es berührt.

Text zu bereinigen ist eine Grenz-Angelegenheit, keine pro Zeile. Die Daten kommen an genau einer Stelle schmutzig herein — beim Import, beim Einfügen, beim Lesen — also bereinige sie dort, einmal, mit einer einzigen CleanText-Funktion wie oben, und vertraue ihr überall danach. Ein Makro, das an der Grenze normalisiert, ist lesbar und korrekt; ein Makro mit vierzig verstreuten Trims ist eines, dessen Autor geraten hat. Schlagen deine Vergleiche nach einer echten Bereinigung noch fehl, ist der Unterschied gar kein Leerraum — es ist ein Chr(160), eine Groß-/Kleinschreibung (siehe CStr / Typumwandlung) oder eine als Text gespeicherte Zahl.

Häufige Trim-Fehler (und die Lösung)

Symptom Ursache Lösung
Wert „sieht getrimmt aus", passt aber nicht Chr(160) am Ende aus Web/PDF-Paste Replace(s, Chr(160), " ") vor Trim
Doppelte Leerzeichen im Inneren bleiben Trim benutzt, das nur die Enden macht WorksheetFunction.Trim(s)
Zeilenumbrüche / Tabs überleben Das sind Steuerzeichen, keine Leerzeichen Erst WorksheetFunction.Clean(s)
„Unzulässige Verwendung von Null" in Schleife Trim$ traf ein Null-Variant Nacktes Trim, oder vorher IsNull prüfen
Trim tut scheinbar nichts an einer Zelle Das Leerzeichen ist Chr(160) oder Chr(9) Asc(Right(s,1)) prüfen, um den echten Code zu sehen
Ganze Spalte passt nach Trim immer noch nicht Bereinigung verstreut, nicht beim Import Ein CleanText-Aufruf an der Lesegrenze

Wenn die Bereinigung den Sinn übersteigt — beschreibe die Aufgabe stattdessen

Du wolltest dich nie mit Leerzeichen befassen. Du wolltest den Export dieser Woche gegen deine Stammliste abgleichen, und die Namen passen nicht, weil die Hälfte in Chr(160) verpackt ankam. Bis du die Bereinigungsfunktion geschrieben, die Spalte durchlaufen und die eine Zeile gejagt hast, die immer noch nicht passt, hat die Mechanik den Nachmittag gefressen. ExcelMaster Agent lässt dich das Ziel in klarem Deutsch formulieren — „bereinige Leerzeichen und versteckte Zeichen in Spalte B und gleiche sie dann mit dem Stammblatt ab" — und schreibt Python, das Chr(160), Steuerzeichen und Groß-/Kleinschreibung erledigt und vorher deine Arbeitsmappe sichert. Kostenlos testen →

Verwandte Anleitungen

FAQ

Warum funktioniert mein VBA-Trim nicht? Fast immer, weil das „Leerzeichen" keines ist. Trim entfernt nur das ASCII-Leerzeichen Chr(32). Aus Webseiten, HTML-Mails oder PDFs eingefügter Text endet oft mit einem geschützten Leerzeichen Chr(160), das Trim behält. Ersetze es zuerst: Trim(Replace(s, Chr(160), " ")).

Entfernt VBA-Trim doppelte Leerzeichen im Inneren? Nein. Das VBA-Schlüsselwort Trim entfernt nur Leerzeichen an den beiden Enden. Um innere Leerzeichenfolgen auf ein einzelnes zu reduzieren, nimm stattdessen die Tabellenfunktion: Application.WorksheetFunction.Trim(s).

Was ist der Unterschied zwischen Trim und Trim$ in VBA? Trim gibt ein Variant zurück und reicht Null unverändert durch; Trim$ liefert direkt einen String, ist etwas schneller und löst bei Null einen Fehler aus. Nutze Trim$ in engen Schleifen mit bekannten Typen und das nackte Trim, wo ein Wert Null sein könnte.

Wie entferne ich geschützte Leerzeichen (Chr 160) in VBA? Ersetze sie durch ein normales Leerzeichen und trimme dann: Application.WorksheetFunction.Trim(Replace(s, Chr(160), " ")). Füge WorksheetFunction.Clean(s) hinzu, um im selben Durchgang Steuerzeichen wie Zeilenumbrüche und Tabs zu entfernen.

Was macht VBA Clean, und ist es dasselbe wie Trim? Nein. Clean entfernt nicht druckbare Steuerzeichen (Codes 0–31, etwa Zeilenumbrüche und Tabs); Trim entfernt Leerzeichen. Sie lösen verschiedene Probleme und werden oft zusammen verwendet. Beachte: Clean entfernt Chr(160) nicht, da 160 außerhalb des Steuerzeichenbereichs liegt.