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

VBA Replace in Excel — Text ersetzen & die Fallen seiner Argumente

|

VBA Replace in Excel — Text ersetzen & die Fallen seiner Argumente

Getestet in: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 09.06.2026

KurzfassungReplace findet einen Teilstring und tauscht ihn gegen einen anderen — jedes Vorkommen, in einem Durchgang. Es ist Strg+H im Code und gibt einen neuen String zurück, statt den Originalen zu ändern:

Sub ReplaceDemo()
    Dim s As String
    s = "2026-04-01"
    Debug.Print Replace(s, "-", "/")     ' 2026/04/01   <- ALLE Bindestriche, ein Aufruf
    Debug.Print s                        ' 2026-04-01   <- Original bleibt unangetastet
End Sub

Die vollständige Signatur, in der der Ärger steckt:

Replace(expression, find, replace, [start], [count], [compare])
'                                    ⚠ Fallen     vbTextCompare = Groß-/Kleinschreibung egal

Das Denkmodell: es ist Strg+H, nicht „tausche den ersten"

Wenn du in Excel Strg+H drückst und „Alle ersetzen" wählst, ändert es jeden Treffer auf einmal. Die VBA-Funktion Replace tut standardmäßig genau das — es gibt keinen „Weitersuchen, frag mich"-Modus. Gib ihr einen String, und sie gibt eine Kopie zurück, in der jedes Vorkommen getauscht ist.

Zwei Dinge folgen direkt aus diesem Modell. Erstens rührt es die Originalvariable nicht an — Replace ist eine Funktion, die das Ergebnis zurückgibt, du musst es also auffangen (s = Replace(s, …)). Zweitens, weil es alles ändert, ist Replace das richtige Werkzeug für pauschale Umwandlungen — alle Trennzeichen normalisieren, alle $ entfernen, alle "N/A" durch "" ersetzen — und das falsche, wenn du nur ein bestimmtes Vorkommen ändern willst. Dazu gleich mehr, denn der Pfad „nur das erste ändern" ist genau dort, wo Replaces Argumente zur Datenverlust-Falle werden.

Die eine Regel: Replace beachtet standardmäßig die Groß-/Kleinschreibung

Das ist die Regel hinter der Hälfte aller „mein Replace tut nichts"-Fragen im Netz:

Standardmäßig vergleicht Replace mit vbBinaryCompare — exakte Schreibweise. Replace("Hello", "h", "J") gibt unverändert "Hello" zurück, weil ein großes H kein kleines h ist.

Um unabhängig von der Schreibweise zu treffen, musst du das sechste Argument ausdrücklich übergeben:

Debug.Print Replace("Hello", "h", "J")                      ' Hello   (kein Treffer!)
Debug.Print Replace("Hello", "h", "J", , , vbTextCompare)   ' Jello   (H getroffen)

Beachte die zwei leeren Kommas — du überspringst start und count, um zu compare zu gelangen. Diese Umständlichkeit ist ein Wink der Sprache: Die mittleren Argumente lässt man üblicherweise in Ruhe. Was uns zur eigentlichen Falle bringt.

Die Falle, die deine Daten frisst: start schneidet das Ergebnis ab

Jeder liest das start-Argument als „ab dieser Position suchen". Das tut es — und wirft außerdem alles davor weg. Der String, den Replace zurückgibt, beginnt bei start:

Debug.Print Replace("ABCDEF", "C", "x", 3)
' Du erwartest: "ABxDEF"
' Du bekommst:  "xDEF"        <- "AB" ist WEG

Ab Position 3 zu starten bedeutet, dass der Rückgabewert beim 3. Zeichen ("CDEF") beginnt, mit angewandter Ersetzung → "xDEF". Die ersten zwei Zeichen werden nicht übersprungen und bewahrt — sie fallen komplett aus der Ausgabe. Einmalig ist das offensichtlich; vergraben in einer Funktion, die 50.000 Zellen verarbeitet, kürzt es still jeden Wert, und du merkst es, wenn die Summen nicht stimmen.

Das count-Argument (max. Anzahl Ersetzungen) ist weniger destruktiv, interagiert aber mit start genau so, wie du es nicht willst, wenn dein echtes Ziel „nur das erste" ist. Die ehrliche Regel: start und count auf ihren Standardwerten lassen. Brauchst du wirklich nur das erste Vorkommen, greif nicht zu count — lokalisiere es mit InStr und bau es mit Mid neu:

' Nur den ERSTEN "-" ersetzen, ohne das Präfix zu verlieren
pos = InStr(s, "-")
If pos > 0 Then s = Left(s, pos - 1) & "/" & Mid(s, pos + 1)

Mehr Code als Replace(s, "-", "/", , 1) — aber es frisst nicht den Anfang deines Strings.

Das andere Replace: Range.Replace ändert das Blatt, nicht einen String

Es gibt zwei völlig verschiedene „Replace" in Excel-VBA, und sie zu verwechseln kostet Stunden. Die Funktion (Replace(...)) wandelt einen String im Speicher um. Die Methode (Range.Replace ...) ist Suchen & Ersetzen auf dem Arbeitsblatt selbst:

' Methode — schreibt Zellen direkt um, ganze Spalte in einem Aufruf, keine Schleife
Columns("B").Replace What:="N/A", Replacement:="", _
                     LookAt:=xlWhole, MatchCase:=False

Ist dein Ziel „diesen Text über einen Zellbereich ändern", dann nicht Zelle für Zelle die String-Funktion in einer Schleife aufrufen. Range.Replace erledigt den ganzen Bereich in einem Rutsch und ist auf großen Blättern dramatisch schneller. Zur String-Funktion greifst du nur, wenn du einen Wert bearbeitest, den du bereits in einer Variablen hältst.

Die Meinung: jene optionalen Argumente sind Fallen, keine Features

VBAs Replace hat sechs Parameter, und das Design sagt dir leise, drei zu nutzen. expression, find, replace — ja. compare — manchmal, wenn die Schreibweise zählt. start und count — fast nie, weil ihr Verhalten (das Ergebnis abschneiden, umständliche Interaktion) jeden überrascht und still Daten beschädigt.

Meine Faustregel: Tippst du das vierte oder fünfte Argument zu Replace, halt inne und frag, ob du eigentlich InStr + Mid willst. Neun von zehn Mal wolltest du „das erste Vorkommen ersetzen" oder „ab hier ersetzen", und die positionsbasierte Variante ist klarer und sicher. Der Aufruf mit zwei übersprungenen Kommas und vbTextCompare ist die einzige „fortgeschrittene" Form von Replace, die ins Muskelgedächtnis gehört.

Wann was

Du willst… Nimm Achte auf
Jedes Vorkommen in einem String tauschen Replace(s, a, b) Rückgabe auffangen: s = Replace(...)
Dasselbe, aber ohne Beachtung der Schreibweise Replace(s, a, b, , , vbTextCompare) Zwei leere Kommas, um start/count zu überspringen
Text über Arbeitsblattzellen ersetzen Range.Replace What:=… Eine Methode, keine Funktion — keine Schleife nötig
Nur das erste Vorkommen ersetzen InStr + Left/Mid count/start schneiden ab oder überraschen
Einen Teilstring komplett entfernen Replace(s, junk, "") Mit leerem String ersetzen

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

Symptom Ursache Lösung
Replace „hat nichts getan" Schreibweise (Standard beachtet sie) vbTextCompare als 6. Argument
Originalstring unverändert Rückgabewert nicht aufgefangen s = Replace(s, …) — gibt eine Kopie zurück
Ausgabe fehlen die ersten Zeichen start-Argument benutzt start weglassen; es schneidet das Ergebnis ab
Alle Treffer ersetzt, wollte nur einen Replace tauscht standardmäßig alle InStr + Mid, um den ersten zu treffen
Langsam auf großem Blatt Funktion über jede Zelle geschleift Range.Replace einmal auf den Bereich
„Argument nicht optional" find oder replace vergessen Alle drei ersten Argumente sind Pflicht

Wenn die Textbereinigung zur Aufgabe wird — beschreibe das Ergebnis

Ein Replace ist trivial. Eine echte Bereinigung ist ein Stapel davon — das $ entfernen, Tausendertrennzeichen tauschen, "N/A" normalisieren, die Datumsbindestriche korrigieren, den Rest trimmen — angewandt über ein Blatt, in der richtigen Reihenfolge, ohne Werte zu zerstören, die legitim ein Dollarzeichen enthalten. ExcelMaster Agent lässt dich den Endzustand beschreiben — „bereinige Spalte C: Währungssymbole entfernen, N/A leeren, Datumsformat vereinheitlichen" — und erzeugt Python, das es sicher erledigt und zuerst deine Datei sichert, ohne start-Argument-Überraschungen. Kostenlos testen →

Verwandte Anleitungen

FAQ

Was macht Replace in VBA? Die Replace-Funktion gibt eine Kopie eines Strings zurück, in der jedes Vorkommen eines Teilstrings durch einen anderen ersetzt ist. Replace("a-b-c", "-", "/") gibt "a/b/c" zurück. Es ändert die Originalvariable nicht — du musst das Ergebnis zurückweisen.

Warum funktioniert mein VBA Replace nicht / ersetzt nichts? Häufigste Ursache ist die Schreibweise. Standardmäßig beachtet Replace Groß-/Kleinschreibung (vbBinaryCompare), also findet Replace("Hello", "h", "J") keinen Treffer. Übergib vbTextCompare als sechstes Argument, um unabhängig von der Schreibweise zu treffen. Die zweithäufigste Ursache ist das Vergessen, den Rückgabewert aufzufangen.

Wie mache ich VBA Replace unabhängig von der Groß-/Kleinschreibung? Füge vbTextCompare als compare-Argument hinzu: Replace(s, find, repl, , , vbTextCompare). Die zwei leeren Kommas überspringen start und count, die du normalerweise auf den Standardwerten lassen solltest.

Warum schneidet VBA Replace den Anfang meines Strings ab? Weil du das start-Argument übergeben hast. Replace gibt einen String zurück, der bei start beginnt — alles davor wird verworfen, nicht bewahrt. Um innerhalb eines Strings zu ersetzen, ohne das Präfix zu verlieren, lass start weg oder nutze InStr + Mid.

Was ist der Unterschied zwischen Replace und Range.Replace? Replace(...) ist eine Funktion, die einen String im Speicher umwandelt. Range.Replace ... ist eine Methode, die Suchen & Ersetzen direkt auf Arbeitsblattzellen über einen ganzen Bereich in einem Aufruf ausführt. Nutze die Methode, um das Blatt zu bearbeiten; die Funktion, um eine String-Variable zu bearbeiten.