Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 05.06.2026
Kurz gesagt — Die Anweisung If...Then...Else führt je nach Bedingung unterschiedlichen Code aus. Kopieren Sie dieses Grundgerüst und passen Sie es an:
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 eine Block deckt 90 % aller Bedingungen ab, die Sie je in VBA brauchen. Der Rest dieser Anleitung zeigt die Muster, die Sie vor den typischen Fehlern bewahren.
Warum die If-Anweisung so wichtig ist
Jedes Makro, das eine Entscheidung trifft — überfällige Rechnungen markieren, Zellen über dem Budget einfärben, leere Zeilen überspringen — basiert auf If. Wer die Struktur einmal sauber beherrscht, schreibt nie wieder das verschachtelte Chaos, das VBA so schwer wartbar macht.
Die vier Formen von If
| Form | Wann verwenden | Braucht End If? |
|---|---|---|
Einzeiliges If |
Eine kurze Aktion, kein Else |
Nein |
Block If...End If |
Ein Zweig, mehrere Zeilen | Ja |
If...Else |
Zwei Ergebnisse | Ja |
If...ElseIf...Else |
Drei oder mehr Ergebnisse | Ja |
' Einzeilig — kein End If, nur eine Anweisung
If zelle.Value = 0 Then zelle.Value = "k. A."
' Block — mehrere Zeilen brauchen End If
If zelle.Value = 0 Then
zelle.Value = "k. A."
zelle.Interior.Color = vbYellow
End If
Faustregel: Sobald Sie zwei Aktionen oder ein
Elsebrauchen, wechseln Sie zur Block-Form mitEnd If. Das Vermischen von einzeiliger und Block-Syntax ist die häufigste Ursache für den Compilerfehler „Block If ohne End If".
Beispiel 1 — Überfällige Rechnungen markieren
Sub UeberfaelligMarkieren()
Dim r As Range
For Each r In Range("D2:D200") ' D = Fälligkeitsdatum
If r.Value < Date And r.Offset(0, 1).Value <> "Bezahlt" Then
r.Offset(0, 2).Value = "ÜBERFÄLLIG"
r.Offset(0, 2).Interior.Color = RGB(255, 199, 206)
End If
Next r
End Sub
Zwei Bedingungen mit And verknüpft — beide müssen wahr sein. Die Rechnung ist überfällig und noch nicht bezahlt.
Beispiel 2 — And gegen Or, endlich klar
And verlangt, dass jede Bedingung wahr ist. Or reicht eine einzige. Genau hier stolpern Einsteiger ständig:
' Nur freigeben, wenn Betrag klein UND Antragsteller Manager ist
If betrag <= 5000 And rolle = "Manager" Then status = "Automatisch freigegeben"
' Eskalieren, wenn Betrag groß ODER Konto markiert ist
If betrag > 50000 Or istMarkiert = True Then status = "Prüfung nötig"
VBA wertet standardmäßig nicht verkürzt aus (kein Short-Circuit). Rufen Sie also keine Funktion in der zweiten Bedingung auf, die fehlschlägt, wenn die erste falsch ist — teilen Sie das lieber in verschachtelte If auf.
Beispiel 3 — Verschachteltes If für einen echten Entscheidungsbaum
Sub Versandstufe()
Dim gewicht As Double, land As String
gewicht = Range("A2").Value
land = Range("B2").Value
If land = "DE" Then
If gewicht <= 1 Then
Range("C2").Value = "Standard 4,99 EUR"
Else
Range("C2").Value = "Schwer 9,99 EUR"
End If
Else
Range("C2").Value = "International 24,99 EUR"
End If
End Sub
Zwei Ebenen Verschachtelung sind in Ordnung. Darüber hinaus leidet die Lesbarkeit — das ist Ihr Signal, auf Select Case umzusteigen (siehe unten).
Beispiel 4 — IIf für schnelle Zuweisungen in einer Zeile
Für eine einfache Zwei-Wege-Entscheidung passt die Funktion IIf in eine Zeile:
Range("C2").Value = IIf(Range("A2").Value > 0, "Gewinn", "Verlust")
Achtung: IIf wertet beide Argumente aus, auch das verworfene. Setzen Sie also niemals eine Division durch null oder einen riskanten Funktionsaufruf hinein.
Beispiel 5 — Eine Zelle prüfen, nicht nur eine Variable
Sub LeereHervorheben()
Dim r As Range
For Each r In Range("A2:A500")
If IsEmpty(r) Then
r.Interior.Color = vbRed
ElseIf Not IsNumeric(r.Value) Then
r.Interior.Color = vbYellow
End If
Next r
End Sub
IsEmpty, IsNumeric und IsError sind die Wächter, die Ihr If vor dem Absturz bei unsauberen Daten bewahren.
Beispiel 6 — Früh aussteigen statt tief verschachteln
Sub ZeileVerarbeiten(r As Range)
If r.Value = "" Then Exit Sub ' Schutzklausel — sofort raus
If Not IsNumeric(r.Value) Then Exit Sub
r.Offset(0, 1).Value = r.Value * 1.2
End Sub
Schutzklauseln (guard clauses) machen den Code flach. Statt alles in If gültig Then ... End If zu packen, weisen Sie die Fehlerfälle früh ab und lassen die eigentliche Logik ohne Einrückung laufen.
Wann If und wann Select Case
| Situation | Verwenden |
|---|---|
| 1–2 Ergebnisse oder Bedingungen über verschiedene Variablen | If...Else |
| 3+ Ergebnisse zur selben Variable | Select Case |
| Wertebereiche (1–10, 11–20 …) | Select Case ... To |
And/Or über mehrere Variablen |
If...ElseIf |
Wenn Sie ElseIf x = 1 ... ElseIf x = 2 ... ElseIf x = 3 zur selben Variable schreiben, ist Select Case sauberer und schneller zu lesen.
Häufige Fehler (und die Lösung)
„Block If ohne End If" — Sie haben ein mehrzeiliges If geöffnet, aber nie geschlossen. Jedes Block-If braucht genau ein End If.
„Else ohne If" — Meist ein verirrtes End If über dem Else oder ein einzeiliges If mit verwaistem Else. Block neu einrücken — der Fehler wird sofort sichtbar.
Die Bedingung ist immer wahr/falsch — Sie haben Text mit einer Zahl verglichen oder einen Tippfehler im Operator. Prüfen Sie die Bedingung mit Debug.Print, um zu sehen, was VBA tatsächlich auswertet.
Textvergleich schlägt unerwartet fehl — "bezahlt" = "Bezahlt" ist False. Schließen Sie beide Seiten in LCase() ein oder setzen Sie Option Compare Text an den Modulanfang.
Schluss mit handgeschriebenen Bedingungen — beschreiben Sie die Regel
Bedingungslogik ist genau die Stelle, an der VBA spröde wird: ein verschachteltes If zu viel und niemand traut sich ein halbes Jahr später noch an den Code. ExcelMaster Agent lässt Sie die Regel in klarem Deutsch formulieren — „markiere Zeilen in Spalte D rot, wenn das Fälligkeitsdatum überschritten und der Status nicht ‚Bezahlt' ist" — und erzeugt die passende Logik, ohne ein vergessenes End If. Kostenlos testen →
Weitere Anleitungen
- VBA For-Schleife in Excel — 8 Praxisbeispiele
- VBA Select Case — der vollständige Leitfaden
- VBA While-Schleife — While, Do While & Do Until erklärt
FAQ
Kann ich If Then Else in eine Zeile schreiben?
Ja, aber nur für eine einzelne Aktion ohne mehrzeiliges Else: If x > 0 Then y = 1. Sobald ein Else oder eine zweite Anweisung dazukommt, brauchen Sie die Block-Form mit End If.
Wie viele ElseIf-Zweige sind möglich?
So viele Sie brauchen — testen aber alle Zweige dieselbe Variable, ist Select Case ab drei Zweigen die lesbarere Wahl.
Warum wird meine If-Bedingung immer ausgeführt?
Meist ein Typkonflikt (Text mit Zahl verglichen) oder Groß-/Kleinschreibung ("Ja" <> "ja"). Prüfen Sie die Bedingung mit Debug.Print.
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.
