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:
Trimerkennt genau ein Zeichen als „zu entfernendes Leerzeichen": das gewöhnliche ASCII-LeerzeichenChr(32). Jedes andere leerzeichenähnliche Zeichen — ein Tabulator, ein Zeilenumbruch und vor allem das geschützte LeerzeichenChr(160)— ist fürTrimein 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 einenStringzurück — wichtig in einer engen Schleife über Tausende von Zellen.Trim$löst beiNulleinen Fehler aus, währendTrimNullstillschweigend durchreicht. Wenn du aus einemVariantliest, dasNullsein könnte (ein Datenbankfeld, ein leeresRange.Value), ist das nackteTrimdas 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
- VBA Format — Datum, Zahlen & warum Formatieren deine Rechnung kaputtmacht
- VBA CStr, CDate & Val — Text richtig in Zahlen und Datum umwandeln
- VBA InStr — Text in einer Zeichenkette finden
- VBA Split — eine Zeichenkette in ein Array verwandeln
- VBA For-Schleife in Excel — 8 praxisnahe Beispiele
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.
