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

VBA Mid, Left & Right in Excel — Teilstring nach Position extrahieren

|

VBA Mid, Left & Right in Excel — Teilstring nach Position extrahieren

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

KurzfassungMid, Left und Right ziehen ein Stück nach Position aus einem String — ein Startpunkt und eine Länge. Left und Right sind nur Mid, an ein Ende geheftet:

Sub SliceDemo()
    Dim s As String
    s = "INV-2026-0042"

    Debug.Print Left(s, 3)      ' INV       <- erste 3 Zeichen
    Debug.Print Right(s, 4)     ' 0042      <- letzte 4 Zeichen
    Debug.Print Mid(s, 5, 4)    ' 2026      <- 4 Zeichen ab Position 5
    Debug.Print Mid(s, 5)       ' 2026-0042 <- keine Länge = bis zum Ende
End Sub

Eins zuerst einprägen: VBA-Strings beginnen bei Position 1, nicht 0.

Das Denkmodell: nach Lineal schneiden, nicht nach Inhalt

Mid ist ein Lineal. Du sagst ihm, wo es beginnen und wie viele Zeichen es nehmen soll, und es schneidet. Es schaut nicht an, was die Zeichen sind — es zählt Positionen. Left(s, n) ist „das Lineal vom Anfang", Right(s, n) „das Lineal vom Ende", und Mid(s, start, len) ist der allgemeine Fall, dessen Abkürzungen beide sind.

Dieser eine Gedanke sagt dir genau, wann diese das richtige Werkzeug sind und wann nicht. Sie glänzen, wenn das Gesuchte an einer festen, bekannten Position sitzt — ein 3-buchstabiges Präfix, die letzten 4 Ziffern, eine Spalte fester Breite. Sie versagen, sobald das Stück wandern kann, denn ein Lineal passt sich nicht an. Das ist die ganze Spannung dieses Artikels und der Grund, warum es InStr und Split gibt.

Die eine Regel: 1-basiert — und dieser Off-by-One ist der häufigste Bug

Aus fast jeder anderen Sprache tippen deine Finger 0-basierte Positionen. VBA funktioniert nicht so:

In Mid(string, start, length) bedeutet start = 1 das erste Zeichen. Mid("Excel", 1, 2) ist "Ex", nicht "xc".

Mach das falsch, und du bekommst keinen Fehler — du bekommst die falschen, um eins verschobenen Zeichen, was weit schlimmer ist als ein Absturz, weil es plausibel aussieht:

Debug.Print Mid("Excel", 1, 2)   ' "Ex"  (richtig — 1 ist das erste Zeichen)
Debug.Print Mid("Excel", 0, 2)   ' Laufzeitfehler 5 — Position 0 gibt es nicht
Debug.Print Mid("Excel", 2, 2)   ' "xc"  (Start beim 2. Zeichen)

Die Begleitregel: Mid ohne Länge gibt alles von start bis zum Ende zurück. Das ist kein zu umgehender Fehler — es ist die sauberste Art, „den Rest des Strings ab hier" zu sagen:

extension = Mid(filename, InStrRev(filename, ".") + 1)   ' alles nach dem letzten Punkt

Was kaum jemand weiß: Mid ist auch eine Anweisung

Es gibt zwei Mid. Die Funktion liest Zeichen heraus. Die Anweisung schreibt Zeichen an Ort und Stelle — sie überschreibt einen Teil des Strings, ohne dessen Länge zu ändern:

Dim s As String
s = "2026-00-15"
Mid(s, 6, 2) = "06"      ' 2 Zeichen ab Position 6 überschreiben
Debug.Print s            ' "2026-06-15"  <- gleiche Länge, an Ort und Stelle gepatcht

Mid(s, 6, 2) = "06" links vom = ist die Anweisung. Sie ist schneller, als den String mit Left & neu & Right neu zu bauen, und die idiomatische Art, ein Feld fester Breite zu patchen. Der Haken, passend zum Denkmodell: sie ändert nie die Länge — weist du einen längeren Ersatz zu, kürzt VBA ihn einfach auf das Fenster. Das Lineal dehnt sich nicht.

Die Left/Right/Mid-Familie in einem Block

Left(s, n)          ' erste n Zeichen
Right(s, n)         ' letzte n Zeichen
Mid(s, start)       ' von start bis zum Ende
Mid(s, start, len)  ' len Zeichen ab start
Len(s)              ' Gesamtzahl der Zeichen (zum Begrenzen der Schnitte)

Left und Right sind keine eigenen Ideen — sie sind Mid mit einer fixierten Koordinate. Left(s, n) ist Mid(s, 1, n). Right(s, n) ist Mid(s, Len(s) - n + 1). Sobald Mid sitzt, sind die anderen zwei geschenkt.

Die Meinung: fest verdrahtete Positionen sind die brüchigste Zeile deines Makros

Mid(s, 5, 4) liest sich schön in der einen Zeile, die du getestet hast. Dann kommt ein Wert ein Zeichen kürzer herein, jede Position verschiebt sich, und deine „Jahr"-Extraktion liefert jetzt "026-". Positionsbasierte Schnitte kodieren eine Annahme — die Daten haben immer genau die Form meines Beispiels —, die echte Daten bei erster Gelegenheit brechen.

Meine Regel: Left/Right/Mid nur, wenn die Position wirklich fix ist — ein Format, das du kontrollierst, ein Export fester Breite, ein Code mit garantiertem Layout. Sobald die Grenze vom Inhalt abhängt (der Text vor dem ersten Leerzeichen, der Teil nach dem Bindestrich, das Stück zwischen zwei Markierungen), hör auf, Zahlen fest zu verdrahten. Finde die Grenze mit InStr und gib die an Mid weiter, oder nutze Split, wenn es ein sauberes Trennzeichen gibt:

' Brüchig: nimmt an, der Bindestrich sei immer an Position 4
code = Left(s, 3)

' Robust: den Bindestrich finden, dort schneiden — funktioniert unabhängig von der Länge
code = Left(s, InStr(s, "-") - 1)

Die zweite Variante ist eine Funktion länger und übersteht den Kontakt mit der Realität. Dieser Tausch lohnt sich fast immer.

Wann was

Du willst… Nimm Achte auf
Die ersten N Zeichen Left(s, n) N größer als Len(s) gibt einfach den ganzen String zurück (sicher)
Die letzten N Zeichen Right(s, n) Dasselbe — kein Fehler, wenn N zu groß ist
N Zeichen ab fester Position Mid(s, start, n) start ist 1-basiert; start = 0 wirft einen Fehler
Alles ab einer Position Mid(s, start) Das Längenargument komplett weglassen
Zeichen an Ort und Stelle überschreiben Mid(s, start, n) = "…" Ändert nie die Länge — Überschuss wird verworfen
Ein Stück, dessen Position wandern kann InStr + Mid, oder Split Die Zahl nicht fest verdrahten

Häufige Mid/Left/Right-Fehler (und die Lösung)

Symptom Ursache Lösung
Ergebnis um ein Zeichen verschoben start als 0-basiert behandelt start = 1 ist das erste Zeichen
„Ungültiger Prozeduraufruf oder ungültiges Argument" (Fehler 5) Mid(s, 0, …) oder negative Länge start ≥ 1, Länge ≥ 0
Extraktion bricht bei kürzeren Werten Position fest verdrahtet Mid(s, 5, 4) Erst die Grenze mit InStr finden
Mid-Anweisung hat den String nicht verlängert So gewollt — sie überschreibt an Ort und Stelle Mit Left & neu & Right neu bauen, um die Länge zu ändern
Ganzer String von Left(s, 50) zurück N hat die Länge überschritten Erwartetes Verhalten; bei Bedarf mit Len(s) begrenzen

Wenn die Schneidelogik die Oberhand gewinnt — beschreibe das Ergebnis

Die Rechnungsnummer aus einer Zelle zu ziehen, sind zwei Zeilen. Sie aus 40.000 Zeilen zu ziehen, die in drei leicht verschiedenen Formaten kommen — manche mit Bindestrich, manche ohne, manche mit Restpräfix — ist ein Knäuel aus InStr, Mid, Längenprüfungen und Fallbacks, das die eigentliche Absicht begräbt. ExcelMaster Agent lässt dich sagen „extrahiere das 4-stellige Jahr aus dem Rechnungscode, egal in welchem Umgebungsformat" und erzeugt Python, das die Varianten behandelt und zuerst deine Arbeitsmappe sichert — kein Off-by-One, keine fest verdrahteten Positionen. Kostenlos testen →

Verwandte Anleitungen

FAQ

Was ist der Unterschied zwischen Mid, Left und Right in VBA? Alle drei extrahieren einen Teilstring nach Position. Left(s, n) nimmt die ersten n Zeichen, Right(s, n) die letzten n, und Mid(s, start, len) nimmt len Zeichen ab start. Left und Right sind Sonderfälle von Mid, an ein Ende des Strings geheftet.

Ist VBA Mid 0-basiert oder 1-basiert? 1-basiert. Mid("Excel", 1, 2) gibt "Ex" zurück — Position 1 ist das erste Zeichen. 0 als Start wirft Laufzeitfehler 5. Dieser Off-by-One ist der häufigste Mid-Bug für Leute aus 0-basierten Sprachen.

Wie bekomme ich mit Mid alles ab einer Position? Das Längenargument weglassen: Mid(s, start) gibt den Teilstring von start bis zum Ende zurück. Mit InStr kombiniert liefert Mid(s, InStr(s, "-") + 1) alles nach dem ersten Bindestrich.

Was ist die Mid-Anweisung in VBA? Mid(s, start, length) = "text" links von einer Zuweisung überschreibt Zeichen an Ort und Stelle, ohne die Länge des Strings zu ändern. Sie ist schneller als ein Neuaufbau und ideal zum Patchen von Feldern fester Breite — aber ein Ersatz länger als das Fenster wird gekürzt.

Warum ist meine Mid-Extraktion in manchen Zeilen falsch? Fast immer eine fest verdrahtete Position, die annimmt, jeder Wert habe dieselbe Länge. Wenn die Grenze vom Inhalt statt von einem festen Offset abhängt, finde sie mit InStr und gib sie an Mid weiter, oder nutze Split, falls es ein Trennzeichen gibt.