Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Message Boxes and Input Boxes | Benutzerinteraktion
Excel VBA für Geschäftsautomatisierung

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")
Abbildung 5.1

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")
Abbildung 5.2

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

  1. Schreibe ein Sub, das mit InputBox nach einer Customer ID fragt und dann mit MsgBox bestätigt: "Kunde [ID] löschen?" mit Ja/Nein-Schaltflächen und einem Fragezeichen-Symbol.
  2. 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.
  3. Nur wenn beide Prüfungen bestanden sind, soll eine abschließende MsgBox angezeigt werden mit dem Text: "Kunde würde hier gelöscht werden."
Hinweis
expand arrow

1. Erfassen der Customer ID und Erstellen der Bestätigung

  • InputBox benötigt eine Eingabeaufforderung und kann als zweiten Parameter einen Titel erhalten — speichere das Ergebnis in einer String-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.
  • MsgBox als Funktion (mit Rückgabewert) benötigt Klammern; kombiniere vbYesNo und vbQuestion mit +.

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 Sub beendet die Prozedur sofort an der jeweiligen Stelle — verwende es direkt in jedem If-Block, jeweils mit einer MsgBox davor, die erklärt, dass nichts passiert ist.
  • Die vbNo-Prüfung erfolgt nach der Bestätigungs-MsgBox, indem das Ergebnis mit der Konstante vbNo verglichen 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 Sub abbrechen, reicht es, diese MsgBox nach beiden Prüfungen zu platzieren, um sicherzustellen, dass sie nur ausgeführt wird, wenn beide bestanden sind.
Lösung
expand arrow
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.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 1

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 5. Kapitel 1
some-alt