Einführung in Userforms
Swipe um das Menü anzuzeigen
UserForms verfügen in Excel für Mac über eingeschränkte oder fehlende Funktionalität — die VBA-IDE auf dem Mac bietet in vielen Versionen keine vollständige Unterstützung für das UserForm-Design, was genau zu diesem unerklärlichen Verhalten führen kann.
MsgBox und InputBox eignen sich für einfache Ja/Nein-Fragen und einzeilige Antworten, aber das Hinzufügen eines Kunden erfordert tatsächlich mehrere Felder gleichzeitig — einen Firmennamen, einen Ansprechpartner, eine Stadt, einen Status. Genau dafür ist ein UserForm gedacht: ein kleines, benutzerdefiniertes Fenster mit eigenen Beschriftungen, Textfeldern, Dropdowns und Schaltflächen, das im VBE erstellt und vollständig durch Ihren Code gesteuert wird.
Erstellen eines Formulars
Klicken Sie im VBE mit der rechten Maustaste auf Ihr Projekt im Projekt-Explorer und wählen Sie Einfügen → UserForm. Eine leere Entwurfsfläche erscheint, zusammen mit einer schwebenden Toolbox mit Steuerelementen, die Sie darauf ziehen können.
Labels, TextBoxes, ComboBoxes und Buttons
Jedes Steuerelement, das Sie auf das Formular ziehen, erhält einen Standardnamen wie TextBox1 oder CommandButton1 — funktional, aber bedeutungslos, sobald ein Formular sechs oder sieben Steuerelemente enthält. Die wichtigste Gewohnheit in diesem Abschnitt ist im Eigenschaftenfenster sichtbar: Benennen Sie jedes Steuerelement sofort nach dem Hinzufügen um, und zwar mit einem kurzen Präfix, das den Typ kennzeichnet (txt für TextBox, cbo für ComboBox, cmd für CommandButton, opt für OptionButton, chk für CheckBox, lst für ListBox), gefolgt von einem beschreibenden Namen. txtCompanyName ist im Code auch nach drei Wochen eindeutig lesbar; TextBox1 hingegen nicht.
Labels sind einfache, nicht-interaktive Textbeschriftungen ("Company Name:") — sie sind für den Benutzer sichtbar, können aber weder beschrieben noch angeklickt werden. TextBoxes dienen zur Eingabe von Freitext. ComboBoxes bieten eine Dropdown-Liste mit Auswahlmöglichkeiten, was genau der Zweck von cboCity und cboStatus ist — die Einschränkung von City und Status auf eine bekannte Liste, anstatt dem Benutzer zu erlauben, "chicago", "Chicago,IL" und "CHI" für denselben Eintrag in verschiedenen Datensätzen frei einzugeben.
Code hinter dem Formular schreiben
Doppelklicken Sie auf ein beliebiges Steuerelement auf der Entwurfsoberfläche, um direkt zu dessen Code zu gelangen – VBA erstellt automatisch eine Ereignisprozedur mit dem Namen ControlName_EventName, und Code, der darin geschrieben wird, wird immer dann ausgeführt, wenn genau dieses Ereignis für genau dieses Steuerelement eintritt. Das Standardereignis eines Buttons ist Click:
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
UserForm_Initialize ist eine spezielle Ereignisprozedur, die automatisch ausgelöst wird, sobald das Formular geladen wird – noch bevor der Benutzer etwas sieht. Daher ist dies der richtige Ort, um ComboBoxes mit .AddItem zu befüllen, anstatt die Auswahlmöglichkeiten manuell im Eigenschaftenfenster einzutragen, insbesondere wenn sich diese Auswahlmöglichkeiten ändern könnten oder aus einem Arbeitsblatt stammen. Unload Me innerhalb von cmdCancel_Click schließt das Formular vollständig; Me bezieht sich immer auf das Formular, in dem der Code gerade ausgeführt wird, sodass diese Zeile unverändert funktioniert, egal wie Sie das Formular später umbenennen.
Durchgearbeitetes Beispiel: Einen neuen Kunden speichern
Dies ist die Prozedur hinter dem Speichern-Button – sie schreibt tatsächlich eine neue Zeile in tblCustomers:
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C" & Format(tbl.ListRows.Count + 1, "000")
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
- Die Anweisung
tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")greift direkt vom Formular zurück in die Arbeitsmappe – ein UserForm ist einfach ein weiteres Stück Code, daher gilt alles über ListObjects auch hier uneingeschränkt; tbl.ListRows.Addfügt tatsächlich eine neue Zeile innerhalb der Tabellenbegrenzung hinzu, anstatt manuell hinter die letzte verwendete Zelle zu schreiben;txtCompanyName.Value,cboCity.Valueund die anderen lesen jeweils den aktuellen Wert, den der Benutzer in das jeweilige Steuerelement eingegeben oder ausgewählt hat –.Valueist bei fast allen Steuerelementtypen üblich, weshalb das gleiche Muster sowohl für TextBoxen als auch für ComboBoxen funktioniert;- Die generierte Kunden-ID-Zeile ist ein vereinfachter Platzhalter für diese Übung – eine echte ID-Generierung müsste auf Lücken oder wiederverwendete IDs prüfen, was diese Zeile nicht tut;
- Unload Me am Ende schließt das Formular erst, nachdem die Zeile geschrieben wurde – ein früheres Schließen würde dazu führen, dass
txtCompanyName.Valueund die anderen Steuerelementwerte nicht mehr ausgelesen werden können, da die Steuerelemente nach dem Entladen des Formulars nicht mehr existieren.
Die Beschriftung "Company Name" im Formular ist lediglich eine benutzerfreundliche Bezeichnung für die Spalte Customer der Tabelle — der Code schreibt txtCompanyName.Value in diese Spalte, unabhängig von der Beschriftung des Labels, da für VBA nur der Name des TextBox-Elements relevant ist, nicht die sichtbare Beschriftung.
Customer ID ist nicht im Formular enthalten, da dieser Wert vom Code automatisch generiert wird ("C0" & (tbl.ListRows.Count + 100)) und nicht vom Benutzer eingegeben werden muss — dies entspricht der Vorgehensweise realer Systeme, bei denen neue Datensätze automatisch nummeriert werden, anstatt eine Person eine eindeutige ID auswählen zu lassen.
Aufgabe
- Einfügen eines neuen UserForms, Benennung als
frmAddCustomerund Hinzufügen von drei TextBoxen (txtCompanyName,txtContact,txtEmail) sowie zwei ComboBoxen (cboCity, cboStatus), jeweils mit passendem Label. - Hinzufügen von zwei CommandButtons,
cmdSaveundcmdCancel, und exaktes Schreiben der ProzedurenUserForm_InitializeundcmdCancel_Clickwie gezeigt. - Schreiben von
cmdSave_Clickwie gezeigt und Hinzufügen eines temporären Buttons an anderer Stelle in der Arbeitsmappe mit dem CodefrmAddCustomer.Show, um das Öffnen des Formulars zu testen. - Ausfüllen des Formulars für einen fiktiven sechsten Kunden und Klick auf Save — Überprüfung, ob eine neue Zeile in tblCustomers mit den eingegebenen Werten erscheint.
1. Formular erstellen
- Einfügen → UserForm im VBE, dann im Eigenschaftenfenster das Feld
(Name)infrmAddCustomerumbenennen — nicht das Feld Caption, da dieses nur den Text in der Titelleiste ändert. - Für Firmenname, Kontakt und E-Mail jeweils ein Label + ein TextBox-Paar hinzufügen; für Stadt und Status jeweils ein Label + ein ComboBox-Paar.
- Jedes Steuerelement sofort nach dem Hinzufügen umbenennen — dies ist die im Kapitel betonte Gewohnheit. Labels benötigen keine codefreundlichen Namen, da sie im Code nie referenziert werden, aber jede TextBox/ComboBox/Schaltfläche schon.
2. UserForm_Initialize und cmdCancel_Click
- Doppelklick auf den leeren Hintergrund des Formulars (nicht auf ein Steuerelement), um zu
UserForm_Initializezu gelangen — ein Doppelklick aufcmdCancelführt direkt zucmdCancel_Click. - Beide Prozeduren wurden im Kapitel exakt vorgegeben — unverändert abtippen.
3. Testen mit einer temporären Schaltfläche
- Diese Schaltfläche muss nicht auf dem Formular liegen — sie kann auf ein beliebiges Arbeitsblatt über Entwicklertools → Einfügen → Schaltfläche (Formularsteuerelement) eingefügt werden, oder alternativ kann ein einzeiliges
Subdirekt aus dem VBE ausgeführt werden, ohne eine Schaltfläche auf dem Arbeitsblatt zu erstellen. frmAddCustomer.Showist der gesamte Code, der benötigt wird, um das Formular anzuzeigen.
4. Test eines vollständigen Speicherns
- Alle Felder ausfüllen und Werte aus beiden Dropdowns auswählen, bevor auf Speichern geklickt wird — eine leere ComboBox-Auswahl würde eine leere Zelle schreiben.
- Anschließend in
tblCustomersnach einer neuen Zeile mit einer ID im StilC00xsuchen.
Private Sub UserForm_Initialize()
' runs once, automatically, when the form is first shown
cboCity.AddItem "Chicago"
cboCity.AddItem "Boston"
cboCity.AddItem "Austin"
cboCity.AddItem "Seattle"
cboCity.AddItem "Denver"
cboStatus.AddItem "Active"
cboStatus.AddItem "Inactive"
cboStatus.AddItem "Prospect"
End Sub
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Zum Testen diesen Code aus einem beliebigen Standardmodul (nicht im UserForm-Code) ausführen:
Sub ShowAddCustomerForm()
frmAddCustomer.Show
End Sub
Mit F5 und dem Cursor in ShowAddCustomerForm öffnet sich das Formular; nach dem Ausfüllen und Speichern wird eine neue Zeile zu tblCustomers hinzugefügt.
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