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

VBA Split in Excel — Einen String richtig in ein Array zerlegen

|

VBA Split in Excel — Einen String richtig in ein Array zerlegen

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

KurzfassungSplit 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 Base du oben im Modul setzt — das Array, das Split zurückgibt, beginnt bei Index 0. Das erste Feld ist parts(0), das letzte parts(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

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.