Getestet in: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 09.06.2026
Kurzfassung — Replace 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
ReplacemitvbBinaryCompare— exakte Schreibweise.Replace("Hello", "h", "J")gibt unverändert"Hello"zurück, weil ein großesHkein kleineshist.
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
- VBA Split — Einen String in ein Array zerlegen
- VBA Mid, Left & Right — Teilstring nach Position extrahieren
- VBA InStr — Text in einem String finden
- VBA For-Schleife in Excel — 8 praxisnahe Beispiele
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.
