Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 06.06.2026
Kurz gesagt — MsgBox zeigt dem Nutzer eine kurze Meldung und ein paar Schaltflächen und sagt Ihnen dann, welche geklickt wurde. Zwei Verwendungen — etwas mitteilen und eine Ja/Nein-Frage stellen:
Sub MsgBoxGrundlagen()
' 1. Mitteilen — zeigen und vergessen (eine Anweisung, KEINE Klammern)
MsgBox "Import abgeschlossen.", vbInformation, "Fertig"
' 2. Fragen — die Antwort auswerten (eine Funktion, Klammern NÖTIG)
Dim antwort As VbMsgBoxResult
antwort = MsgBox("Markierte Zeile löschen?", vbYesNo + vbQuestion, "Bestätigen")
If antwort = vbYes Then
Selection.EntireRow.Delete
End If
End Sub
Genau dieser eine Unterschied — Klammern oder keine — steckt hinter fast jedem „Expected: end of statement", das Leute mit MsgBox erleben. Der Rest dieser Anleitung dreht sich darum.
Das Denkmodell: MsgBox ist eine Sprechanlage, keine Tastatur
Stellen Sie sich eine Sprechanlage an der Wand vor. Sie können eine Zeile an alle Zuhörenden durchsagen und ihnen ein paar Schaltflächen zum Antworten anbieten — Ja, Nein, Abbrechen, Wiederholen. Was Sie nicht können: hören, wie sie einen ganzen Satz tippen. Sobald Sie freie Eingabe brauchen — einen Dateinamen, eine Zahl, ein Datum — sind Sie über MsgBox hinausgewachsen und wollen InputBox oder ein UserForm.
MsgBox erledigt also genau zwei Dinge gut: dem Nutzer etwas mitteilen oder eine geschlossene Frage stellen und auf den Klick verzweigen. Bleiben Sie dabei, und es macht nie Ärger.
Die eine Regel: Anweisungsform gegen Funktionsform
MsgBox hat zwei Gesichter, und welches Sie nutzen, entscheidet, ob Klammern erlaubt sind.
Anweisungsform — Sie wollen die Meldung nur zeigen und kümmern sich nicht um den Klick:
MsgBox "Gespeichert!" ' ✅
MsgBox "Gespeichert!", vbInformation, "Status" ' ✅ Argumente mit Komma getrennt, KEINE Klammern
MsgBox ("Gespeichert!", vbInformation) ' ❌ Expected: end of statement
Die letzte Zeile scheitert, weil VBA ( … ) nach einer Anweisung als „werte diesen einen Ausdruck aus" liest — und "Gespeichert!", vbInformation ist kein einzelner Ausdruck, sondern eine Argumentliste. Klammern gehören nur an einen Funktionsaufruf.
Funktionsform — Sie wollen den Rückgabewert, also weisen Sie ihn zu, und jetzt sind Klammern Pflicht:
Dim r As VbMsgBoxResult
r = MsgBox("Datei überschreiben?", vbYesNo) ' ✅ Rückgabewert genutzt → Klammern nötig
Die Regel in einem Satz: Rückgabewert genutzt → Klammern; ignoriert → keine Klammern. Verinnerlichen Sie das, und der Fehler verschwindet für immer.
Die Antwort über den Namen lesen, nie über die Zahl
MsgBox gibt eine Ganzzahl zurück, aber vergleichen Sie nie mit einer rohen Zahl. vbYes ist zufällig 6 — schreiben Sie vbYes, nicht 6. Die benannten Konstanten lesen sich wie Klartext und überstehen jeden, der das Makro liest (auch Sie selbst, später):
Select Case MsgBox("Änderungen vor dem Schließen speichern?", vbYesNoCancel + vbExclamation)
Case vbYes: ThisWorkbook.Save
Case vbNo: ' ohne Speichern schließen — nichts tun
Case vbCancel: Exit Sub ' Nutzer rudert zurück → ganzes Makro stoppen
End Select
Dieses dreiteilige vbYesNoCancel ist das Muster zum Merken: Abbrechen = „Ich habe es mir anders überlegt, stopp alles." Ehren Sie das mit Exit Sub, und Ihre Nutzer vertrauen dem Makro.
Schaltflächen und Symbole kombiniert man mit +
Das zweite Argument packt zwei unabhängige Entscheidungen — welche Schaltflächen und welches Symbol — in eine Zahl, also addiert man sie:
MsgBox "Festplatte fast voll.", vbOKOnly + vbCritical ' rotes ✖ Symbol
MsgBox "Nachtlauf jetzt starten?", vbYesNo + vbQuestion ' blaues ? Symbol
MsgBox "Netzwerkfehler — wiederholen?", vbRetryCancel + vbExclamation ' gelbes ! Symbol
Sie liegen in verschiedenen „Fächern" der Zahl, weshalb + sauber funktioniert. Eine andere als die Standard-Schaltfläche hervorheben (damit ein achtloses Enter nichts löscht)? Fügen Sie vbDefaultButton2 hinzu, um die zweite Schaltfläche zum Standard zu machen.
Eine Variable in die Meldung einbauen
Ein konstanter Text ist in echten Makros selten — fast immer wollen Sie eine Anzahl, einen Namen, ein Ergebnis melden. Verketten mit &, und vbNewLine für einen Zeilenumbruch:
Dim n As Long
n = WorksheetFunction.CountA(Range("A:A")) - 1
MsgBox "Verarbeitet: " & n & " Zeilen." & vbNewLine & _
"Fertig um " & Format(Now, "hh:mm:ss"), vbInformation, "Bericht"
Das & (nicht +) zum Verbinden von Text und vbNewLine für den Umbruch sind die zwei Dinge, die am häufigsten vergessen werden.
MsgBox nicht zum Debuggen nutzen
Der häufigste Missbrauch: MsgBox x durch eine Schleife streuen, um „den Wert zu sehen". Bei 500 Zeilen sind das 500 Klicks — und das Makro friert bei jedem ein. MsgBox ist modal: Es blockiert bis zum Klick, absichtlich, weil es einen Menschen zum Innehalten und Entscheiden bringen soll.
Zum Beobachten von Werten beim Entwickeln nutzen Sie stattdessen das Direktfenster:
Debug.Print "Zeile " & i & " = " & zelle.Value ' Strg+G zum Lesen, null Klicks, kein Blockieren
Faustregel: MsgBox ist ein Entscheidungstor für den Endnutzer; Debug.Print ist das Ausgabewerkzeug des Entwicklers. Beides zu verwechseln macht Makros unbeholfen.
Häufige MsgBox-Fehler (und die Lösung)
| Symptom | Ursache | Lösung |
|---|---|---|
| „Expected: end of statement" | Klammern an der Anweisungsform: MsgBox ("Hi", vbYesNo) |
Klammern weglassen oder Ergebnis zuweisen: r = MsgBox("Hi", vbYesNo) |
| Antwort passt nie | Vergleich mit Magiezahlen 6 / 7 |
Mit Konstanten vbYes / vbNo vergleichen |
| Makro läuft nach Abbrechen weiter | Nur vbYes geprüft, vbCancel ignoriert |
Case vbCancel: Exit Sub ergänzen |
| Titel steht an falscher Stelle | Argumentreihenfolge ist prompt, buttons, title |
Titel ist das dritte Argument: MsgBox "Text", vbOKOnly, "Titel" |
| Text und Zahl kleben zusammen | Mit + verbunden, was addiert oder Fehler wirft |
Mit & verbinden: "Gesamt " & n |
| Schaltflächen + Symbol erscheinen nicht beide | Komma dazwischen genutzt | Mit + kombinieren: vbYesNo + vbQuestion |
Sparen Sie sich das Dialog-Gerüst — beschreiben Sie einfach die Regel
Eine MsgBox-Rückfrage ist für eine Entscheidung gut. Wird aber die Logik dahinter zur eigentlichen Arbeit — „vor dem Löschen prüfen, ob Spalte D leer ist und das Datum in der Vergangenheit liegt" —, dann steckt dort der Aufwand. ExcelMaster Agent lässt Sie die Regel in klarem Deutsch sagen — „lösche Zeilen, deren Status leer ist und deren Fälligkeitsdatum vergangen ist, aber frag mich vorher" — und schreibt den Wächter, die Rückfrage und das Löschen für Sie. Kostenlos testen →
Weitere Anleitungen
- VBA InputBox in Excel — die zwei InputBoxen & wann welche
- VBA UserForm in Excel — ein echtes Eingabeformular bauen
- VBA If Then Else in Excel — Bedingungen richtig gemacht
- VBA For-Schleife in Excel — 8 Praxisbeispiele
FAQ
Was ist MsgBox in VBA?
MsgBox ist eine eingebaute VBA-Funktion, die ein kleines Dialogfenster mit einer Meldung und einer oder mehreren Schaltflächen zeigt und dann einen Wert zurückgibt, der sagt, welche Schaltfläche geklickt wurde. Nutzen Sie es, um den Nutzer zu informieren oder eine einfache Ja/Nein-Frage zu stellen.
Warum kommt „Expected: end of statement" bei MsgBox?
Weil Sie die Argumente in Klammern gesetzt haben, während Sie MsgBox als Anweisung nutzen, z. B. MsgBox ("Hi", vbYesNo). Klammern sind nur erlaubt, wenn Sie den Rückgabewert auswerten: antwort = MsgBox("Hi", vbYesNo). Ohne Rückgabewert lassen Sie die Klammern weg: MsgBox "Hi", vbYesNo.
Wie erstelle ich ein Ja/Nein-Meldungsfenster in VBA?
Rufen Sie MsgBox als Funktion mit der Konstante vbYesNo auf und lesen Sie das Ergebnis: If MsgBox("Weiter?", vbYesNo) = vbYes Then …. Für das Fragezeichen-Symbol vbQuestion ergänzen: vbYesNo + vbQuestion.
Wie zeige ich ein Symbol in einer VBA-MsgBox?
Addieren Sie eine Symbol-Konstante mit + zum Schaltflächen-Argument: vbCritical (rotes ✖), vbExclamation (gelbes !), vbQuestion (blaues ?) oder vbInformation (blaues i). Beispiel: MsgBox "Fertig", vbOKOnly + vbInformation.
Wie baue ich eine Variable in eine MsgBox ein?
Verbinden Sie Text und Variable mit &: MsgBox "Gesamt: " & gesamt. Mit vbNewLine beginnen Sie eine neue Zeile in der Meldung.
Was ist der Unterschied zwischen MsgBox und InputBox?
MsgBox gibt nur eine Meldung aus und liefert zurück, welche Schaltfläche geklickt wurde — es kann keinen getippten Text annehmen. InputBox fordert den Nutzer zur Eingabe eines Werts auf und gibt das Getippte zurück. Nutzen Sie MsgBox zum Informieren oder Bestätigen, InputBox zum Erfassen von Eingaben.
