Lernpfad
Wenn du schon ein paar VBA-Makros geschrieben hast, kam sicher der Moment, in dem du prüfen musstest, ob bestimmter Text in einer Zelle vorkommt. In VBA ist InStr eine dieser Funktionen, die man ständig braucht. Sie sagt dir, an welcher Position ein Textteil innerhalb eines anderen Textes erscheint. Du kannst damit prüfen, ob Text in einer Zelle existiert, Werte in einem Text parsen oder bedingte Logik in Makros steuern, die von Textmustern abhängt.
In diesem Leitfaden führe ich dich durch die InStr-Syntax, zeige Beispiele, erkläre die Vergleichsmodi (das verwirrt mehr Leute, als es sollte) und stelle Muster vor, die du wirklich wiederverwenden wirst.
Ich empfehle dir, mit unserem Excel Fundamentals-Lernpfad zu starten, um dir eine solide Basis aufzubauen, bevor du in VBA einsteigst. Oder nimm unseren Kurs Advanced Excel Functions, wenn du bereits Erfahrung hast, um zu lernen, wie Funktionen die Effizienz in der Datenanalyse steigern.
Was ist die VBA-Funktion InStr?
InStr ist eine VBA-Funktion, die die Position des ersten Vorkommens eines Strings innerhalb eines anderen Strings zurückgibt.
Die Ergebnisse verhalten sich wie folgt:
- Wenn ein Treffer gefunden wird, erhältst du eine Zahl (die Position, an der der Treffer beginnt)
- Wenn nichts gefunden wird, lautet das Ergebnis 0
Erscheint zum Beispiel „cat“ an Position 5 in einem String, bekommst du 5. Ist es nicht vorhanden, bekommst du 0.
VBA InStr-Syntax
Hier ist die vollständige InStr-Syntax:
InStr([start], string1, string2, [compare])
Dabei gilt:
-
start(optional): Legt fest, wo VBA mit der Suche beginnen soll. Wenn du es weglässt, startet VBA bei Position 1. -
string1(erforderlich): Der komplette Text, in dem du suchst. -
string2(erforderlich): Der Text, den du finden möchtest. -
compare(optional): Definiert die Art des Vergleichs (groß-/kleinsensitiv oder nicht). Wenn du es weglässt, nutzt VBA den Standardvergleichsmodus, meist groß-/kleinsensitiv.
Beachte, dass du die Argumente start und compare ignorieren kannst (InStr(string1, string2)) für eine einfachere Variante. Wenn du jedoch das Argument compare verwendest, musst du auch start angeben.
So funktioniert VBA InStr
Stell dir InStr wie das Lesen eines Satzes von links nach rechts vor, Zeichen für Zeichen.
Die Funktion nimmt string1, durchsucht ihn und sucht die erste Stelle, an der string2 passt. Sobald sie diesen Treffer findet, stoppt sie und gibt die Startposition zurück.
Die „Treffer“-Position ist wichtig, weil VBA ab 1 zählt, nicht ab 0. Das erste Zeichen eines Strings hat also die Position 1, das zweite 2, und so weiter.
Rückgabewerte von VBA InStr erklärt
Das Ergebnis einer InStr-Funktion ist leicht zu interpretieren. Du bekommst entweder:
-
Eine positive Zahl: Ein Treffer wurde gefunden, und die Zahl sagt dir, wo er beginnt.
-
0: Kein Treffer irgendwo im String
Wenn allerdings deine Eingabestrings Null sind, gibt die Funktion Null zurück. Für einfache Makros kannst du das ignorieren, aber der Unterschied kann stillschweigend eine Bedingung aushebeln.
Einfache VBA InStr-Beispiele
Jetzt zeige ich dir ein paar Beispiele, wie du die VBA-Funktion InStr verwendest.
Ein Wort in einem Satz finden
Um zu prüfen, ob das Wort „before“ in der Notiz „Deliver before noon“ vorkommt.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Das Ergebnis ist 9, weil „before“ beim 9. Zeichen beginnt.
Prüfen, ob ein Zeichen existiert
Um zu prüfen, ob das Zeichen „0“ in einem String vorhanden ist, nutze folgendes VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
In diesem Fall bedeutet jedes Ergebnis größer als 0, dass das Zeichen gefunden wurde.
Suche vom Anfang eines Strings
Um vom Anfang eines Strings zu suchen, musst du die Startposition nicht angeben – es beginnt bei 1. Das ist immer der Standard, sofern du nichts anderes vorgibst.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
VBA InStr in If-Anweisungen verwenden
In echten Tabellen willst du nicht nur eine Zahl – du willst eine Entscheidung treffen. Am häufigsten setzt man InStr in einer If-Anweisung ein, um Daten zu filtern.
In diesem Tutorial nutzen wir ein Beispieldataset Orders mit den Spalten: ID, CustomerName, Email, City und OrderNotes.
If InStr(...) > 0 Then
Da InStr 0 zurückgibt, wenn nichts gefunden wird, prüfen wir, ob ein Ergebnis existiert, indem wir auf eine Zahl größer als 0 testen.
Im Beispiel unten wird die Spalte OrderNotes (Spalte 5) geprüft. Wenn das Wort „Fragile“ gefunden wird, schreibt es „Handle Carefully“ in Spalte 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Bedingte Prüfungen für Keywords und Textfilter
Du kannst die Funktion InStr auch nutzen, um nach Keywords in Strings zu suchen, besonders wenn sich die Formulierung leicht ändert. Das folgende Beispiel prüft, ob die Notiz „Call“ enthält (wie „Call on arrival“ oder „Call before delivery“). Anschließend wird markiert und der Tag „Call Customer“ in Spalte 6 gesetzt.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
VBA InStr: Groß-/Kleinschreibung und Vergleichsmodi
Standardmäßig ist InStr groß-/kleinsensitiv (genannt vbBinaryCompare). Suchst du z. B. nach „chicago“, die Daten enthalten aber „Chicago“, gibt InStr 0 zurück.
Um das zu beheben, nutzt du das Argument compare, wobei gilt:
-
vbBinaryCompare(Standard): Groß-/kleinsensitiv („A“ ist nicht gleich „a“.) -
vbTextCompare: Nicht groß-/kleinsensitiv – „A“ ist gleich „a“.
Im folgenden Beispiel gibt InStr 0 zurück, da nach „fragile“ (klein) in „Fragile items“ gesucht wird.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Mit vbTextCompare erhältst du hingegen 1 beim selben Suchlauf, da die Groß-/Kleinschreibung ignoriert wird.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr mit Startposition
Manchmal willst du eine Suche nicht am Anfang des Strings starten. Das Argument start legt fest, wo VBA zu suchen beginnt.
Im Beispiel unten ist start auf 10 gesetzt, daher beginnt VBA ab dem 10. Zeichen statt beim ersten zu suchen. Später im String findet es dann "delivery".
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Das Ergebnis ist 31, die Position, an der "delivery" beginnt.
Diese Methode ist nützlich, wenn du das zweite Vorkommen suchst oder bei wiederkehrenden Mustern einen bekannten Präfix ignorieren willst.
VBA InStr vs. InStrRev
Wie du gelernt hast, sucht InStr von links nach rechts. InStrRev sucht hingegen von rechts nach links.
Im Beispiel unten nutzen wir InStrRev, um den letzten Punkt in der E-Mail zu finden. Das Ergebnis ist 18, die Position des Punkts vor „com“.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev ist besonders hilfreich, wenn du das letzte Vorkommen brauchst oder mit Dateinamen, E-Mails oder Pfaden arbeitest.
Häufige Anwendungsfälle für VBA InStr
Nachdem wir uns Beispiele zur Funktionsweise von InStr angeschaut haben, hier die gängigsten Use Cases.
Prüfen, ob eine Zelle ein Keyword enthält
Angenommen, du hast ein Dataset mit Kundenbestellungen und musst Aufträge für eine spezielle Behandlung markieren. Der Code schaut in die Spalte OrderNotes und markiert alles mit „noon“.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
E-Mail-ähnlichen Text validieren
Du kannst InStr auch verwenden, um E-Mail-Formate schnell grob zu prüfen. Der Code unten checkt, ob die E-Mail ein @ enthält, und schreibt „Valid Email Format“ in Spalte 6.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Trennzeichen wie Kommas oder Bindestriche erkennen
Mit InStr kannst du prüfen, ob Bindestrich, Komma oder Slash in einem Text vorkommen. Im Beispiel unten durchläuft der Code OrderNotes (Spalte E), prüft, ob ein Komma vorhanden ist, und schreibt dann ein Ergebnis in Spalte F.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Häufige Fehler mit VBA InStr
Auch als erfahrener Developer kannst du mit InStr auf Stolpersteine stoßen, die dein Code unerwartet verhalten lassen. Hier sind häufige Probleme, die mir begegnet sind, und wie du sie löst:
-
Vergessen, dass InStr 1-basiert ist: Denk daran: Positionen starten bei 1, nicht bei 0. Wenn du aus Python oder JavaScript kommst, fühlt sich das anfangs ungewohnt an.
-
InStr wie True/False behandeln: Denk daran,
InStrliefert nichtTrueoderFalse. Wenn du etwas finden willst, prüfe, ob das Ergebnis> 0ist. -
Groß-/Kleinschreibung ignorieren: Wie du weißt, ist
InStrstandardmäßig groß-/kleinsensitiv. Wenn es darauf nicht ankommt, gib das mitvbTextCompareim Argumentcomparean. -
string1 und string2 verwechseln: Merke: Das erste Argument ist, wo du suchst. Das zweite ist, wonach du suchst. Wenn du so suchst:
InStr(SearchTerm, FullText), bekommst du immer0.
VBA InStr im Vergleich zu anderen Stringfunktionen
Da InStr normalerweise zeigt, wo ein String im Text steht, vergleichen wir es mit anderen Stringfunktionen.
InStr vs. Like
Der Operator Like wird für Musterabgleiche verwendet. Im Beispiel unten wird nach „Fragile“ gesucht, allerdings mit dem Muster *, was „beliebig davor oder danach“ bedeutet.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Nutze InStr, wenn du nur wissen willst, ob ein Text existiert, und Like, wenn du komplexe Muster prüfen musst.
InStr vs. Replace
Während du mit InStr den gesamten Zellwert ändern könntest, ersetzt die Funktion Replace gezielt bestimmten Text in der Zelle.
Im Beispiel unten tauscht Replace direkt „Fragile“ gegen „Handle Carefully“ im Text aus.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr vs. Mid
Die Funktion Mid dient dazu, Text aus einem String zu extrahieren. Daher nutzt du Mid oft zusammen mit InStr, um nach Ermittlung der Position zu extrahieren.
Der Code unten extrahiert die Domain aus E-Mails im Dataset. Die Funktion InStr findet, wo „@“ in der E-Mail erscheint, dann startet Mid die Extraktion direkt danach. Zum Schluss wird die Domain in Spalte H geschrieben.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr vs.Split
Die Funktion Split teilt Text anhand eines Trennzeichens in Teile.
Im Beispiel unten liest der Code jede Zeile aus Spalte A, prüft, ob ein Komma vorhanden ist, und teilt dann den Text in zwei Teile. Er schreibt Name → Spalte B und City → Spalte C.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Only split if a comma exists
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
Best Practices für die Nutzung von VBA InStr
Damit dein VBA sauber läuft, empfehle ich folgende Best Practices, die mir viel Zeit gespart haben:
-
Nutze vbTextCompare, wenn die Groß-/Kleinschreibung egal ist: Da echte Daten selten konsistente Schreibweisen haben, verpasst du sonst Matches, wenn du dich auf den Standardvergleich verlässt.
-
Mit „If“ für klare Logik kombinieren: Baue immer eine Logik ein, die einen Wert zurückgibt –
InStrallein liefert nur eine Zahl. -
Auf > 0 prüfen, nicht auf exakte Positionen – es sei denn, du brauchst die Position wirklich.
-
Parsing lesbar halten. Staple nicht zu viele Funktionen in eine Zeile.
Fazit
InStr ist simpel, aber du wirst es überall verwenden. Die Funktion liefert dir die Position eines Strings innerhalb eines anderen – und diese eine Zahl steuert viele Entscheidungen in VBA: Ob etwas existiert, wo extrahiert werden soll und was ein Makro als Nächstes tun soll. Für sich genommen ist es nur eine Suche. In Kombination mit Funktionen wie Mid, Replace oder Split wird es Teil eines Workflows, der wirklich Ergebnisse liefert.
Belege unseren Kurs Data Analysis in Excel, um fortgeschrittene Analysen zu meistern. Außerdem: Nimm unseren Kurs Intermediate Power Query in Excel, um mehr über Datentransformation und die M-Sprache zu lernen.
FAQs
Was gibt InStr eigentlich zurück?
Sie gibt die Position zurück, an der der Treffer beginnt. Wenn nichts gefunden wird, lautet das Ergebnis 0.
Ist InStr groß-/kleinsensitiv?
Ja, InStr unterscheidet standardmäßig Groß- und Kleinschreibung. ”Fragile” und ”fragile” werden unterschiedlich behandelt. Nutze vbTextCompare, wenn der Vergleich nicht groß-/kleinsensitiv sein soll.
Was bedeutet es, dass InStr 1-basiert ist?
Das erste Zeichen in einem String hat die Position 1, nicht 0. Das ist wichtig, wenn du das Ergebnis in anderen Funktionen weiterverwendest.
Was passiert, wenn einer der Werte Null ist?
Das Ergebnis ist ebenfalls Null, nicht 0.
Was ist der Unterschied zwischen InStr und InStrRev?
InStr sucht von links nach rechts, während InStrRev von rechts nach links startet. Nutze Letzteres, wenn das letzte Vorkommen relevant ist.
