MsgBox und InputBox sind die schnellsten Wege, um mit dem Benutzer zu reden:
eine Meldung anzeigen, eine Ja/Nein-Frage stellen, einen Wert abfragen. Beide sind
in wenigen Sekunden eingebaut – aber es lohnt sich, sie richtig zu benutzen, statt
nur MsgBox "Fertig" zu tippen. In dieser Lektion lernst du Buttons, Icons, die
Auswertung der Antwort und wann du besser ein eigenes Formular nimmst.
MsgBox in zwei Rollen
MsgBox gibt es in zwei Formen. Als Anweisung zeigt sie nur etwas an – die
Antwort interessiert dich nicht:
MsgBox "Der Export ist abgeschlossen."
Als Funktion (mit Klammern) liefert sie zurück, welchen Button der Benutzer geklickt hat. Diese Form brauchst du für Rückfragen:
Dim antwort As VbMsgBoxResult
antwort = MsgBox("Datensatz wirklich löschen?", vbYesNo)
Buttons und Icons kombinieren
Der zweite Parameter steuert Buttons und Symbol. Du kombinierst die Konstanten
mit + oder Or. Die wichtigsten Button-Konstanten:
| Konstante | Angezeigte Schaltflächen |
|---|---|
vbOKOnly | OK (Standard) |
vbOKCancel | OK, Abbrechen |
vbYesNo | Ja, Nein |
vbYesNoCancel | Ja, Nein, Abbrechen |
vbRetryCancel | Wiederholen, Abbrechen |
Und die Icon-Konstanten:
| Konstante | Symbol | Einsatz |
|---|---|---|
vbInformation | blaues „i" | reine Information |
vbQuestion | Fragezeichen | Rückfrage |
vbExclamation | gelbes Warndreieck | Warnung |
vbCritical | rotes Kreuz | Fehler |
' Löschbestätigung mit Frage-Icon
MsgBox "Datensatz löschen?", vbYesNo + vbQuestion
' Fehlermeldung mit rotem Symbol
MsgBox "Die Datei wurde nicht gefunden.", vbCritical
Mit vbDefaultButton2 machst du den zweiten Button zum Standard (fokussiert). Bei
gefährlichen Aktionen ist das sinnvoll, damit ein versehentliches Enter nicht
sofort löscht:
MsgBox "Wirklich alles löschen?", vbYesNo + vbCritical + vbDefaultButton2
Die Antwort auswerten
Der Rückgabewert ist eine der vbMsgBoxResult-Konstanten. Vergleiche direkt damit –
nicht mit Zahlen:
If MsgBox("Datensatz löschen?", vbYesNo + vbQuestion) = vbYes Then
' Löschen ausführen
DoCmd.RunCommand acCmdDeleteRecord
End If
Die möglichen Rückgaben:
| Rückgabe | Geklickter Button |
|---|---|
vbOK | OK |
vbCancel | Abbrechen (auch bei Esc) |
vbYes | Ja |
vbNo | Nein |
vbRetry | Wiederholen |
Bei drei Schaltflächen prüfst du mit Select Case:
Select Case MsgBox("Änderungen speichern?", vbYesNoCancel + vbQuestion)
Case vbYes
SpeichereDaten
Case vbNo
' verwerfen, aber weitermachen
Case vbCancel
Exit Sub ' Vorgang ganz abbrechen
End Select
Titel und mehrzeilige Texte
Der dritte Parameter setzt den Fenstertitel. Ohne ihn steht dort „Microsoft Access":
MsgBox "Import erfolgreich.", vbInformation, "Datenimport"
Längere Meldungen zerlegst du mit vbCrLf in mehrere Zeilen. Für Absätze nutzt du
zwei davon:
Dim text As String
text = "Der Import ist abgeschlossen." & vbCrLf & vbCrLf
text = text & "Neue Datensätze: 128" & vbCrLf
text = text & "Übersprungen: 3"
MsgBox text, vbInformation, "Ergebnis"
vbCrLf ist die Kombination aus Wagenrücklauf und Zeilenvorschub. vbNewLine
funktioniert genauso; vbTab fügt einen Tabulator ein, wenn du Werte ausrichten
willst.
InputBox: einen Wert abfragen
InputBox fragt eine Texteingabe ab und gibt sie als String zurück:
Dim name As String
name = InputBox("Wie heißt der neue Kunde?", "Neuanlage")
Der zweite Parameter ist der Titel, der dritte ein Vorgabewert im Eingabefeld:
Dim jahr As String
jahr = InputBox("Für welches Jahr?", "Auswertung", Year(Date))
Die Abbruch-Falle bei InputBox
Hier liegt der häufigste Fehler: InputBox gibt einen leeren String "" zurück,
wenn der Benutzer auf Abbrechen klickt oder das Feld leer lässt und OK
drückt. Du kannst beides an der Rückgabe allein nicht sicher unterscheiden. Prüfe
das Ergebnis immer, bevor du weiterarbeitest:
Dim eingabe As String
eingabe = InputBox("Bitte Kundennummer eingeben:", "Suche")
If Len(eingabe) = 0 Then
' Abbruch oder leere Eingabe – nichts tun
Exit Sub
End If
If Not IsNumeric(eingabe) Then
MsgBox "Bitte eine Zahl eingeben.", vbExclamation
Exit Sub
End If
Achtung: Weil
InputBoximmer Text liefert, musst du bei Zahlen selbst mitIsNumericprüfen und mitCLng/CDblkonvertieren. Und du kannst die Eingabe nicht wirklich validieren, während sie stattfindet – erst nach dem Schließen.
Die Grenzen von MsgBox und InputBox
Beide sind praktisch, aber schnell am Limit:
- Nur ein Eingabefeld. Für mehrere Werte müsstest du mehrere
InputBoxnacheinander aufrufen – umständlich und leicht abzubrechen. - Keine Validierung während der Eingabe, keine Auswahllisten, keine Kalender.
- Kein einheitliches Aussehen und keine Pflichtfeld-Logik.
- Der Code blockiert, bis der Dialog geschlossen wird.
Sobald du mehr als eine Ja/Nein-Frage oder einen einzelnen Wert brauchst, ist ein
eigenes Access-Formular die bessere Wahl. Öffne es modal mit
DoCmd.OpenForm "frmDialog", , , , , acDialog – der Code wartet dann genauso, bis
das Formular geschlossen ist, aber du hast volle Kontrolle über Felder,
Comboboxen, Validierung und Layout. MsgBox und InputBox bleiben für kurze
Rückfragen und schnelle Meldungen erste Wahl; alles Komplexere gehört ins Formular.
Zusammengefasst
MsgBoxals Anweisung zeigt nur an; als Funktion mit Klammern liefert sie den geklickten Button zurück.- Buttons und Icons kombinierst du im zweiten Parameter (
vbYesNo + vbQuestion); werte die Antwort gegen Konstanten wievbYesaus, nicht gegen Zahlen. - Titel steht im dritten Parameter, mehrzeilige Texte baust du mit
vbCrLf. InputBoxliefert""sowohl bei Abbrechen als auch bei leerer Eingabe – immer mitLen(...) = 0undIsNumericprüfen.- Für alles jenseits einer einzelnen Frage oder eines Werts ist ein eigenes
modales Formular (
acDialog) die robustere Lösung.