Message Boxes and Input Boxes
Swipe um das Menü anzuzeigen
Bevor ein vollständiges Formular erstellt wird, lohnt es sich, die beiden einfachsten Möglichkeiten zu beherrschen, wie VBA mit einem Benutzer kommunizieren kann: MsgBox, das Informationen anzeigt und optional eine Frage stellt, und InputBox, das eine kurze Texteingabe abfragt.
MsgBox
In der einfachsten Form zeigt MsgBox lediglich eine Nachricht an und wartet darauf, dass der Benutzer auf OK klickt:
MsgBox "Customer saved successfully."
Wird MsgBox auf diese Weise verwendet – als Anweisung, ohne Klammern und ohne Rückgabewert – ist es eine Sackgasse: Die Nachricht wird angezeigt und der Code läuft weiter, unabhängig davon, was der Benutzer tut. Sobald Sie wissen müssen, welche Schaltfläche angeklickt wurde, wird MsgBox zu einer Funktion statt einer Anweisung. Das bedeutet, dass Klammern und eine Variable zum Speichern des Ergebnisses benötigt werden:
result = MsgBox("Delete customer Urban Retail?", _
vbYesNo + vbQuestion, "Confirm Delete")
vbYesNo und vbQuestion werden mit einem einfachen + kombiniert, was beim ersten Mal ungewöhnlich erscheint, aber einfach die Art ist, wie VBA zwei unabhängige Einstellungen – welche Schaltflächen angezeigt werden und welches Symbol erscheint – zu dem einzelnen zweiten Argument zusammenfasst, das MsgBox erwartet. result enthält einen der in VBA eingebauten Konstanten, vbYes oder vbNo, die eigentlich nur Zahlen sind (6 und 7, wobei man die Zahl nie direkt schreiben würde). Eine Aktion kann mit einer einfachen If-Anweisung abhängig gemacht werden:
If result = vbYes Then
' proceed with deletion
End If
InputBox
Während MsgBox immer nur eine feste Menge von Button-Konstanten zurückgibt, fordert InputBox den Benutzer auf, etwas einzugeben, und gibt genau das zurück, was eingegeben wurde:
city = InputBox("Enter a City to search for:", _
"Search Customers", "Chicago")
Das dritte Argument, hier "Chicago", füllt das Textfeld vorab aus – nützlich, um eine wahrscheinliche Antwort vorzuschlagen, die der Benutzer entweder übernehmen oder überschreiben kann. Zwei Details werden beim ersten Mal leicht übersehen: Was auch immer der Benutzer eingibt, wird immer als String zurückgegeben, unabhängig vom Aussehen. Wenn also 25 eingegeben wird, erhält man den Text "25" und nicht die Zahl 25; für Berechnungen muss daher CInt oder CDbl verwendet werden. Außerdem löst ein Klick auf Abbrechen keinen Fehler aus und stoppt den Code nicht – es wird einfach ein leerer String ("") zurückgegeben, den der Code explizit prüfen muss, falls eine leere Antwort nicht zulässig ist.
Benutzereingaben und Bestätigungen
Die Kombination beider Methoden ist das Standardmuster für jede Aktion, die Benutzereingaben liest und anschließend eine Bestätigung benötigt, bevor etwas Risikoreiches ausgeführt wird:
Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
searchCity = InputBox("Enter a City to search for:", "Search Customers")
If searchCity = "" Then
MsgBox "Search cancelled — no city entered."
Exit Sub
End If
confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
' ... proceed with the search
Beachte, dass confirmMsg als As VbMsgBoxResult deklariert wird und nicht als generischer Typ – dies ist der tatsächlich benannte Typ, den VBA für den Rückgabewert von MsgBox verwendet. Die explizite Deklaration (statt als Variant) ermöglicht es der VBE, während der Eingabe Autovervollständigung für vbYes, vbNo und die übrigen Konstanten anzubieten. Die Überprüfung auf einen leeren String nach InputBox und die Prüfung auf vbNo nach MsgBox verwenden beide das gleiche Abbruchmuster, Exit Sub, das die Prozedur sofort beendet, anstatt in Code weiterzulaufen, der gültige Eingaben voraussetzt.
Aufgabe
- Schreibe ein
Sub, das mitInputBoxnach einer Customer ID fragt und dann mit MsgBox bestätigt: "Kunde [ID] löschen?" mit Ja/Nein-Schaltflächen und einem Fragezeichen-Symbol. - Behandle sowohl den Fall eines leeren Strings (Benutzer klickt auf Abbrechen in der InputBox) als auch den
vbNo-Fall (Benutzer lehnt die Bestätigung ab), indem das Sub frühzeitig mit einer Nachricht beendet wird, die erklärt, dass nichts passiert ist. - Nur wenn beide Prüfungen bestanden sind, soll eine abschließende MsgBox angezeigt werden mit dem Text: "Kunde würde hier gelöscht werden."
1. Erfassen der Customer ID und Erstellen der Bestätigung
InputBoxbenötigt eine Eingabeaufforderung und kann als zweiten Parameter einen Titel erhalten — speichere das Ergebnis in einerString-Variablen.- Die Bestätigungsnachricht muss die tatsächliche ID mit
&verknüpfen, nicht als festen Text eingeben — andernfalls würde immer wortwörtlich "[ID]" angezeigt. MsgBoxals Funktion (mit Rückgabewert) benötigt Klammern; kombinierevbYesNoundvbQuestionmit+.
2. Behandlung von Abbrechen und Nein
- Überprüfe den leeren String direkt nach der
InputBox-Zeile, bevor du versuchst, eine Bestätigungsnachricht zu erstellen — es macht keinen Sinn, "Kunde löschen?" zu fragen, wenn keine ID vorhanden ist. Exit Subbeendet die Prozedur sofort an der jeweiligen Stelle — verwende es direkt in jedemIf-Block, jeweils mit einerMsgBoxdavor, die erklärt, dass nichts passiert ist.- Die
vbNo-Prüfung erfolgt nach der Bestätigungs-MsgBox, indem das Ergebnis mit der KonstantevbNoverglichen wird.
3. Die abschließende Bestätigung
- Diese Zeile wird nur ausgeführt, wenn der Ablauf sie erreicht — da beide vorherigen Prüfungen bei Fehlschlag mit
Exit Subabbrechen, reicht es, dieseMsgBoxnach beiden Prüfungen zu platzieren, um sicherzustellen, dass sie nur ausgeführt wird, wenn beide bestanden sind.
Option Explicit
Sub DeleteCustomerPrompt()
Dim customerID As String
Dim confirmResult As VbMsgBoxResult
' Step 1 — ask for the Customer ID
customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")
' Step 2a — handle Cancel / empty input
If customerID = "" Then
MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
Exit Sub
End If
' Step 1 (continued) — confirm with Yes/No
confirmResult = MsgBox("Delete customer " & customerID & "?", _
vbYesNo + vbQuestion, "Confirm Delete")
' Step 2b — handle No
If confirmResult = vbNo Then
MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
Exit Sub
End If
' Step 3 — both checks passed
MsgBox "Customer would be deleted here."
End Sub
Führe das Makro aus (F5) und teste alle drei Wege: Klicke auf Abbrechen in der InputBox, klicke auf Nein in der Bestätigung und gib schließlich eine ID ein und klicke auf Ja — jede Aktion sollte eine der drei unterschiedlichen Nachrichten anzeigen.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen