Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 05.06.2026
Kurz gesagt — If...Then...Else führt je nach Bedingung anderen Code aus. Kopieren und anpassen:
Sub NoteBerechnen()
Dim punkte As Long
punkte = Range("A1").Value
If punkte >= 90 Then
Range("B1").Value = "Sehr gut"
ElseIf punkte >= 75 Then
Range("B1").Value = "Gut"
ElseIf punkte >= 60 Then
Range("B1").Value = "Befriedigend"
Else
Range("B1").Value = "Nicht bestanden"
End If
End Sub
Dieser Block ist 90 % dessen, was Sie je mit Bedingungen tun. Aber zu wissen, welche Form Sie greifen — und welche eine Falle If lautlos sprengt — zählt mehr als das nächste Snippet.
Die eine Idee: If ist eine Checkliste unabhängiger Fragen
If...ElseIf ist eine Checkliste. VBA liest sie von oben nach unten, stellt eine Ja/Nein-Frage nach der anderen und führt den Block unter der ersten Frage aus, die mit True antwortet — den Rest überspringt es. Das Entscheidende: Jede Frage darf eine andere Variable betreffen.
If stunden > 40 Then ' Frage zu den Stunden
lohn = "Überstunden"
ElseIf rolle = "Freiberufler" Then ' eine andere Frage, zur Rolle
lohn = "Pauschale"
Else
lohn = "Standard"
End If
Genau diese Freiheit — jeder Zweig fragt nach etwas anderem — ist der Zweck von If. Und sie zeigt Ihnen, wann Sie es entwachsen sind: sobald jeder Zweig denselben Wert prüft (punkte >= 90, punkte >= 75 …), haben Sie einen Verteiler aus Checklisten-Teilen gebaut. Das ist das Signal, zu Select Case zu wechseln.
Die Falle, die mehr Makros sprengt als jeder Syntaxfehler: VBA wertet nicht verkürzt aus
In den meisten Sprachen hält If a And b bei a an, wenn a falsch ist — b wird nie betrachtet. VBA tut das nicht. Es wertet beide Seiten aus, immer. Das hier sieht sicher aus und ist es nicht:
' ABSTURZ, wenn rng = Nothing — VBA wertet rng.Rows.Count trotzdem aus
If Not rng Is Nothing And rng.Rows.Count > 0 Then ...
Weil VBA rng.Rows.Count selbst dann prüft, wenn rng Is Nothing, bekommen Sie einen Laufzeitfehler auf einer Zeile, die wie ein Schutz aussieht. Die Lösung: Machen Sie die Fragen sequenziell — verschachteln Sie sie, damit die zweite nur läuft, wenn die erste bestanden hat:
If Not rng Is Nothing Then
If rng.Rows.Count > 0 Then ...
End If
Dieses eine Verhalten erklärt einen riesigen Anteil der „aber meine If-Bedingung ist doch richtig!"-Fehler. Wer weiß, dass VBA immer beide Operanden auswertet, packt keine riskanten Aufrufe mehr in And/Or.
Die andere Regel: Das einzeilige If hat kein End If
Jedes If hat eine von zwei Formen, und sie zu vermischen ist der häufigste Compilerfehler („Block If ohne End If"):
' Einzeilig — genau eine Aktion, KEIN End If
If zelle.Value = 0 Then zelle.Value = "k. A."
' Block — sobald Sie eine zweite Zeile oder ein Else brauchen, brauchen Sie End If
If zelle.Value = 0 Then
zelle.Value = "k. A."
zelle.Interior.Color = vbYellow
End If
Die Regel ist simpel: zwei Aktionen oder ein Else? Block-Form, geschlossen mit End If. Etwas dazwischen gibt es nicht.
Die Formen als Beleg — And, Or, Verschachtelung, IIf
Das Modell haben Sie; hier die Konstrukte, die es in die Tat umsetzen.
And verlangt alles wahr; Or reicht eines — der Unterschied, über den Einsteiger stolpern:
If betrag <= 5000 And rolle = "Manager" Then status = "Automatisch freigegeben"
If betrag > 50000 Or istMarkiert Then status = "Prüfung nötig"
Verschachtelung für echt abhängige Fragen — aber zwei Ebenen tief ist die Grenze, bevor die Lesbarkeit kippt (und wieder Ihr Stichwort für Select Case):
If land = "DE" Then
If gewicht <= 1 Then versand = "Standard" Else versand = "Schwer"
Else
versand = "International"
End If
IIf ist eine Funktion, keine Anweisung — praktisch für eine einzeilige Zwei-Wege-Wahl, aber sie wertet beide Argumente aus (dieselbe Regel ohne Short-Circuit), also nie eine Division durch null oder einen riskanten Aufruf hinein:
Range("C2").Value = IIf(Range("A2").Value > 0, "Gewinn", "Verlust")
Wann If und wann Select Case
| Situation | Verwenden |
|---|---|
| Zweige fragen nach verschiedenen Variablen | If...ElseIf |
| 1–2 Ergebnisse | If...Else |
| 3+ Ergebnisse, alle zum selben Wert | Select Case |
| Wertebereiche eines Werts (1–10, 11–20 …) | Select Case ... To |
Die ehrliche Regel: verschiedene Fragen → Checkliste (If); ein Wert, viele Antworten → Verteiler (Select Case).
Häufige Fehler — und warum sie passieren
- „Block If ohne End If" / „Else ohne If". Sie haben einzeilige und Block-Syntax vermischt. Neu einrücken; jedes Block-
Ifbraucht genau einEnd If. - Die Bedingung ist immer wahr/falsch. Meist ein Typkonflikt (Text vs. Zahl) oder Groß-/Kleinschreibung (
"Ja" <> "ja"). Prüfen Sie die Bedingung mitDebug.Print. - Ein „Schutz" stürzt trotzdem ab. Kein Short-Circuit — teilen Sie das
Andin verschachtelteIf. - Textvergleich verfehlt.
"bezahlt" <> "Bezahlt". Beide Seiten inLCase(), oderOption Compare Text.
Wenn die Bedingungen den Code überleben
If ist das richtige Werkzeug, um nach verschiedenen Fragen zu verzweigen — aber Geschäftsregeln stehen nicht still. Jede neue Schwelle bedeutet Bearbeiten, erneutes Testen und Hoffen, dass Sie sechs Monate später keinen Zweig zerschossen haben. ExcelMaster Agent lässt Sie die Regel auf Deutsch formulieren — „markiere Zeilen in Spalte D rot, wenn das Fälligkeitsdatum überschritten und der Status nicht ‚Bezahlt' ist" — und erzeugt die Logik, ohne ein vergessenes End If. Kostenlos testen →
Weitere Anleitungen
- VBA Select Case — der Verteiler für einen Wert, viele Ergebnisse
- VBA For-Schleife in Excel — 8 Praxisbeispiele
- VBA While-Schleife — While, Do While & Do Until erklärt
FAQ
Wann sollte ich If statt Select Case verwenden?
Wenn Ihre Zweige nach verschiedenen Variablen fragen oder Sie nur ein bis zwei Ergebnisse haben. Sobald jeder Zweig denselben Wert gegen drei oder mehr Optionen prüft, liest sich Select Case besser.
Wertet VBA And / Or verkürzt aus?
Nein. VBA wertet jedes Mal beide Operanden aus. Setzen Sie nie einen Aufruf, der scheitern könnte (auf einem Nothing-Objekt, einem fehlenden Schlüssel), in die zweite Hälfte eines And — verschachteln Sie die Bedingungen.
Kann ich If Then Else in eine Zeile schreiben?
Nur für eine einzelne Aktion ohne mehrzeiliges Else: If x > 0 Then y = 1. Mit Else oder zweiter Anweisung brauchen Sie die Block-Form mit End If.
Was ist der Unterschied zwischen If und IIf?
If ist eine Anweisung, die steuert, welche Zeilen laufen. IIf() ist eine Funktion, die einen von zwei Werten zurückgibt — und sie wertet beide aus, also halten Sie riskante Ausdrücke heraus.
