Getestet in: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 09.06.2026
Kurzfassung — Split nimmt einen String, zerschneidet ihn an jedem Trennzeichen und gibt die Teile als nullbasiertes Array zurück. Es ist die genaue Umkehrung des Zusammenfügens von Strings:
Sub SplitDemo()
Dim parts() As String
parts = Split("Jones,Sarah,Finance", ",") ' an jedem Komma trennen
Debug.Print parts(0) ' Jones <- erstes Teil ist Index 0, nicht 1
Debug.Print parts(2) ' Finance
Debug.Print UBound(parts) ' 2 <- letzter Index, 3 Elemente = 0,1,2
End Sub
Die vollständige Signatur — mit den zwei Argumenten, die kaum jemand nutzt:
Split(expression, [delimiter], [limit], [compare])
' der String Standard " " max. Teile vbTextCompare = Groß-/Kleinschreibung egal
Das Denkmodell: Split ist das Ent-Verketten
Wenn "a" & "," & "b" Teile zu einem String zusammenklebt, ist Split das Werkzeug, das sie wieder auseinandernimmt. Du übergibst einen String, dem die Struktur bereits eingebaut ist — eine CSV-Zeile, ein Dateipfad, ein Nachname,Vorname, eine pipe-getrennte Logzeile — und es gibt die Felder als Array zurück, über das du iterieren kannst.
Dieser Blickwinkel ist wichtig, denn er zeigt, wann man Split statt seiner Nachbarn nimmt: Split eignet sich, wenn ein einzelnes Trennzeichen jede Grenze markiert. Brauchst du stattdessen ein Stück an einer festen Position (Zeichen 3–5), ist das ein Fall für Mid/Left/Right. Musst du erst finden, wo eine Markierung steht, ist das InStr. Split ist für „dieser String ist eine Liste, gib mir die Liste".
Die eine Regel: Das Array ist immer nullbasiert — auch mit Option Base 1
Das ist die Regel, die funktionierenden Code von einem stillen Bug trennt:
Egal welches
Option Basedu oben im Modul setzt — das Array, dasSplitzurückgibt, beginnt bei Index 0. Das erste Feld istparts(0), das letzteparts(UBound(parts)).
Hier der Bug, der Leute einen halben Tag kostet. Sie kennen Arrays und schreiben eine Schleife ab 1:
' ⚠ FALSCH — verschluckt stillschweigend das erste Feld
For i = 1 To UBound(parts)
Debug.Print parts(i)
Next i
Diese Schleife läuft ohne Fehler. Sie berührt nur nie parts(0) — also verschwindet „Jones", und niemand merkt es, bis ein Bericht bei jedem Datensatz den Vornamen vermissen lässt. Die Lösung: immer ab 0 iterieren:
For i = 0 To UBound(parts) ' 0 To UBound — deckt jedes Teil ab
Debug.Print parts(i)
Next i
UBound gibt den letzten Index zurück, nicht die Anzahl. Drei Elemente bedeuten UBound = 2. Brauchst du die Anzahl, ist es UBound(parts) + 1. Präg dir das ein: Split ist nullbasiert, UBound ist der oberste Index, Schleifen laufen 0 To UBound.
Die zweite Falle: Split ist wörtlich, nicht clever
Split vergleicht das Trennzeichen genau so, wie es geschrieben ist — es trimmt nicht, versteht keine Anführungszeichen, ist kein Regex. Zwei Folgen davon erwischen Leute ständig.
Es behält die Leerzeichen. "a, b, c" an einem Komma getrennt ergibt "a", " b", " c" — die Teile ab dem ersten tragen ein führendes Leerzeichen. Vergleichst du sie mit "b", passt es nicht. Trimme jedes Teil, oder trenne an ", " und akzeptiere, dass ein einziges abweichendes Format alles bricht:
parts = Split("a, b, c", ",")
For i = 0 To UBound(parts)
parts(i) = Trim(parts(i)) ' jedes Feld säubern — siehe vba-mid / Trim
Next i
Kein Treffer ist kein Fehler. Trennst du einen String, der das Trennzeichen nicht enthält, bekommst du ein einelementiges Array — Index 0 hält den ganzen Originalstring. Sichere also immer ab, bevor du mehrere Felder annimmst:
parts = Split(userInput, ",")
If UBound(parts) < 1 Then
MsgBox "Erwartet wird ein durch Komma getrennter Wert."
Exit Sub
End If
Und die scharfe Kante: Split("") auf einem leeren String gibt ein Array zurück, dessen UBound −1 ist. Eine 0 To UBound-Schleife tut gefahrlos nichts, aber der Zugriff auf parts(0) knallt mit „Index außerhalb des gültigen Bereichs". Prüfe die Eingabe oder UBound(parts) >= 0, bevor du indizierst.
Zwei Argumente, die sich lohnen: limit und compare
limit begrenzt, wie viele Teile du bekommst — das letzte Element behält den ganzen Rest ungeteilt. Perfekt für „den Schlüssel abtrennen, den Wert in Ruhe lassen":
parts = Split("error: file not found: budget.xlsx", ":", 2)
' parts(0) = "error"
' parts(1) = " file not found: budget.xlsx" <- Rest unangetastet, Doppelpunkte inklusive
compare:=vbTextCompare macht ein alphabetisches Trennzeichen unabhängig von Groß-/Kleinschreibung — "1xRED2Xblue" an "x" getrennt findet beide x nur mit Textvergleich. Nischig, aber die Antwort, wenn eine Trennung an einem Buchstaben die Hälfte ihrer Grenzen verfehlt.
Die Meinung: Split ist kein CSV-Parser — hör auf, Regex daranzukleben
Sobald jemand eine CSV-Datei hat, ist der Reflex Split(line, ","). Es funktioniert — bis zu dem Tag, an dem ein Feld ein Komma in Anführungszeichen enthält — "Smith, Jr.",Sales — und Split fröhlich „Smith" und „ Jr." in zwei Felder schneidet und jede folgende Spalte verschiebt. Die Daten sind jetzt still falsch.
Meine Regel: Split ist für Trenndaten, die du kontrollierst, nicht zum Parsen des CSV-Formats. Interne pipe-getrennte Logs, eine selbst gebaute Nachname,Vorname-Zelle, ein an \ getrennter Pfad — perfekt. Aber sobald die Quelle ein echter CSV-Export aus dem System eines anderen ist, ist Split das falsche Werkzeug, und die Antwort ist kein 40-zeiliger Regex-Flicken obendrauf. Es ist ein richtiger Parser (Power Query, eine echte CSV-Routine oder eine Bibliothek), der Anführungszeichen versteht. Zu wissen, wo Split aufhört, ist der Unterschied zwischen einem robusten Import und einem Spaltenverschiebungs-Bug, den du in der Produktion findest.
Wann was
| Du hast… | Nimm | Warum |
|---|---|---|
| Einen String, sauberes Einzelzeichen-Trennzeichen an jeder Grenze | Split |
Gibt die Felder als Array zurück |
| Ein Teil an fester Position (Zeichen 1–3) | Left / Mid / Right | Schneidet nach Position, ohne Trennzeichen |
| Erst finden, wo eine Markierung steht | InStr | Gibt die Position zum Schneiden zurück |
| Echte CSV mit Feldern in Anführungszeichen | Power Query / CSV-Parser | Split kann keine Quotes berücksichtigen |
| Ein Array wieder zu einem String fügen | Join(arr, ",") |
Die exakte Umkehrung von Split |
Häufige Split-Fehler (und die Lösung)
| Symptom | Ursache | Lösung |
|---|---|---|
| Erstes Feld fehlt im Ergebnis | Schleife bei 1 statt 0 begonnen |
For i = 0 To UBound(parts) |
„Index außerhalb des Bereichs" bei parts(0) |
Eingabe war leer → UBound = −1 |
Erst mit If UBound(parts) >= 0 absichern |
| Felder haben führende Leerzeichen | An "," statt ", " getrennt, kein Trim |
Nach dem Trennen jedes Teil Trim() |
Ganzer String in parts(0), viele erwartet |
Trennzeichen kam in der Eingabe nie vor | Mit If UBound(parts) < 1 absichern |
| CSV-Spalten um eins verschoben | Ein Feld enthielt ein Komma in Anführungszeichen | Echten CSV-Parser nutzen, kein Split |
Type mismatch bei der Zuweisung |
Ziel als As String statt Array deklariert |
Dim parts() As String deklarieren |
Wenn die String-Akrobatik den Zweck überwiegt — beschreibe die Aufgabe
Trennen ist selten das Ziel. Das Ziel ist „diesen chaotischen Export einlesen, die Namen säubern, sie mit meiner Stammliste abgleichen". Bis du den Split bewaffnet, jedes Feld getrimmt, den Leerfall abgesichert und die Zeile behandelt hast, die das Format gesprengt hat, erschlägt die Parsing-Verkabelung die eine Sache, die du eigentlich wolltest. ExcelMaster Agent lässt dich dieses Ziel in normaler Sprache formulieren — „teile die Spalte Name in Vor- und Nachname, trimme sie, markiere Zeilen, die nicht passen" — und erzeugt Python, das die Randfälle behandelt und zuerst deine Datei sichert. Kostenlos testen →
Verwandte Anleitungen
- VBA Mid, Left & Right — Teilstring nach Position extrahieren
- VBA Replace — Text ersetzen & die Fallen seiner Argumente
- VBA InStr — Text in einem String finden
- VBA For-Schleife in Excel — 8 praxisnahe Beispiele
FAQ
Was macht Split in VBA?
Split teilt einen String in ein Array von Teilstrings, geschnitten an jedem Vorkommen eines Trennzeichens (standardmäßig ein Leerzeichen). Split("a,b,c", ",") gibt ein dreielementiges Array zurück: "a", "b", "c". Das Array ist nullbasiert, das erste Element ist also Index 0.
Warum fehlt im VBA-Split-Array das erste Element?
Fast immer, weil deine Schleife bei 1 beginnt. Split gibt unabhängig von Option Base 1 ein nullbasiertes Array zurück, das erste Feld ist also Index 0. Iteriere For i = 0 To UBound(arr), um es einzuschließen.
Wie bekomme ich die Anzahl der Elemente aus Split?
Mit UBound(arr) + 1. UBound gibt den höchsten Index zurück, nicht die Anzahl — drei Elemente haben UBound = 2. Bei einem leeren Eingabestring ist UBound −1, sichere also ab, bevor du Element 0 indizierst.
Kann VBA Split mehrere Trennzeichen nutzen?
Nicht direkt — Split nimmt ein Trennzeichen. Der übliche Trick: die anderen Trennzeichen zuerst per Replace durch dein Haupttrennzeichen ersetzen, dann einmal splitten. Für Komplexeres nimm Regex oder einen Parser statt verketteter Ersetzungen.
Unterscheidet VBA Split Groß-/Kleinschreibung?
Nur relevant, wenn dein Trennzeichen ein Buchstabe ist. Standardmäßig vergleicht Split das Trennzeichen exakt (binär). Übergib compare:=vbTextCompare als viertes Argument, um ein alphabetisches Trennzeichen ohne Beachtung der Groß-/Kleinschreibung zu vergleichen.
