Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 06.06.2026
Kurz gesagt — Ein UserForm ist ein eigener Dialog, den Sie einmal entwerfen und mit Ereigniscode steuern. Steuerelemente hinzufügen, festlegen, was jede Schaltfläche tut, dann anzeigen. Das Ganze in drei Teilen:
' 1. Im Formularmodul — Code, der beim Klick auf OK läuft:
Private Sub btnOK_Click()
If txtName.Value = "" Then
MsgBox "Name ist erforderlich.", vbExclamation
Exit Sub
End If
Me.Hide ' ausblenden, aber die Werte für den Aufrufer LESBAR halten
End Sub
' 2. Im Formularmodul — Abbrechen schließt nur:
Private Sub btnCancel_Click()
Me.Tag = "cancel"
Me.Hide
End Sub
' 3. In einem normalen Modul — anzeigen und das Getippte lesen:
Sub DatensatzHinzufuegen()
With frmEntry
.Show ' hält hier an, bis das Formular ausgeblendet wird
If .Tag = "cancel" Then Unload frmEntry: Exit Sub
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = .txtName.Value
End With
Unload frmEntry ' erst nach dem Lesen zerstören
End Sub
Haben Sie sich je gefragt „Warum ist das Textfeld leer, nachdem der Nutzer es ausgefüllt hat?" — das ist die Hide-gegen-Unload-Regel, und sie ist das Herz dieser Anleitung.
Das Denkmodell: Sie lassen das Steuer los, das Formular übernimmt
MsgBox und InputBox sind synchron: Eine Zeile läuft, Sie bekommen einen Wert, die nächste Zeile läuft. Ein UserForm bricht diesen Takt. Wenn Sie .Show aufrufen, übergibt Ihr Code das Steuer an das Formular und hält an. Was als Nächstes geschieht, entscheidet nicht die nächste Zeile Ihres Makros — sondern welches Steuerelement der Nutzer anklickt, und jedes führt seinen eigenen kleinen Code-Brocken aus.
Die Frage, die jeder Anfänger stellt — „Wo ist mein Code nach UserForm1.Show hin?" — hat also eine klare Antwort: Er wartet. Die eigentliche Arbeit ist in die Ereignisprozeduren der Steuerelemente gewandert, etwa btnOK_Click. Ein UserForm ist drei Dinge, zusammengeklebt:
- Der Entwurf — die Steuerelemente, die Sie daraufziehen (TextBox, ComboBox, CommandButton), einmal zur Entwurfszeit eingerichtet.
- Der Ereigniscode —
Private Sub-Prozeduren im Modul des Formulars, eine je möglicher Nutzeraktion. - Der Aufruf —
frmEntry.Showaus einem normalen Modul.
Sobald Sie es als „Objekt, das Code ausführt, wenn man es anstößt" sehen und nicht als „Funktion, die einen Wert zurückgibt", verlieren UserForms ihren Schrecken.
In drei Schritten eines bauen
- Im VBA-Editor (Alt+F11) Einfügen ▸ UserForm. In den Eigenschaften
(Name)auffrmEntrysetzen — Formulare und Steuerelemente jetzt zu benennen erspart Ihnen später dasTextBox1-,TextBox2-Chaos. - Aus der Werkzeugsammlung daraufziehen: zwei TextBox (
txtName,txtQty), eine ComboBox (cboDept) und zwei CommandButton (btnOK,btnCancel). Bezeichnungsfelder daneben setzen. - Eine Schaltfläche doppelklicken — der Editor springt direkt in ihr
_Click-Ereignis. Dort lebt ihr Verhalten.
Die eine Regel: Me.Hide behält Werte, Unload Me zerstört sie
Diese Regel entscheidet, ob Ihr Formular als Eingabewerkzeug funktioniert.
Unload Meentfernt das Formular aus dem Speicher und setzt jedes Steuerelement auf leer zurück. Lesen SietxtName.Valuenach einem Unload, bekommen Sie""— die Daten sind weg.Me.Hidemacht das Formular unsichtbar, lässt es aber im Speicher leben, Werte intakt. Die Ausführung kehrt zur Zeile nach.Showzurück, und der Aufrufer kann nochfrmEntry.txtName.Valuelesen.
Das Muster für jedes Formular, das Daten zurückgibt, lautet also: OK ruft Me.Hide auf, der Aufrufer liest die Steuerelemente, und erst dann macht der Aufrufer Unload. Ein Unload Me im btnOK_Click ist der häufigste Grund für „das Formular verliert, was ich getippt habe".
Private Sub btnOK_Click()
' erst prüfen, dann AUSBLENDEN (hier nicht Unload)
If Not IsNumeric(txtQty.Value) Then
MsgBox "Menge muss eine Zahl sein.", vbExclamation
txtQty.SetFocus
Exit Sub
End If
Me.Hide
End Sub
Das Formular in UserForm_Initialize einrichten
Alles, was das Formular braucht, bevor der Nutzer es sieht — Auswahllisten, Vorgabewerte, das heutige Datum — gehört in das Ereignis UserForm_Initialize, nicht in das aufrufende Makro. So bleibt das Formular in sich geschlossen: Es ist jedes Mal korrekt, egal wer es zeigt.
Private Sub UserForm_Initialize()
cboDept.List = Array("Vertrieb", "Finanzen", "Betrieb") ' Dropdown füllen
txtQty.Value = "1" ' sinnvoller Vorgabewert
txtName.SetFocus ' Cursor startet hier
End Sub
Modal oder nicht-modal — bewusst wählen
.Show ist standardmäßig modal (vbModal): Der Nutzer muss das Formular erledigen, bevor er das Blatt anfasst, und Ihr aufrufender Code wartet. Genau das wollen Sie bei der Dateneingabe. Nutzen Sie .Show vbModeless nur für eine schwebende Hilfspalette, die der Nutzer beim Arbeiten offen lässt — und wissen Sie, dass Ihr aufrufendes Makro dann ohne Warten weiterläuft.
frmEntry.Show ' modal — Aufrufer pausiert (der Normalfall)
frmTools.Show vbModeless ' nicht-modal — Aufrufer läuft weiter, Formular schwebt
Nicht überverdrahten
Eine verlockende Falle: _Change-Ereignisse über jedes Steuerelement streuen für „Live"-Prüfung. Sie feuern ständig, lösen sich gegenseitig aus und machen das Debuggen zum Whack-a-Mole. Einmal prüfen, in btnOK_Click, dann ausblenden. Halten Sie jede Ereignisprozedur kurz und auf eine Sache fokussiert.
Und erkennen Sie, wann ein UserForm die falsche Antwort ist: Wenn Sie 10+ Felder anordnen und es über einen Bildschirm hinausläuft, ist das ein Signal, es auf eine MultiPage aufzuteilen — oder zuzugeben, dass die Daten wirklich in eine schlichte Excel-Tabelle gehören, in die der Nutzer direkt tippt. Ein UserForm lohnt sich bei etwa 3–8 Feldern mit echter Prüfung; darunter ist eine InputBox-Kette leichter, darüber schlägt ein Tabellenblatt oft das Formular.
Häufige UserForm-Fehler (und die Lösung)
| Symptom | Ursache | Lösung |
|---|---|---|
| Textfeld leer, nachdem der Nutzer es ausfüllte | Unload Me in btnOK_Click löschte die Werte |
Me.Hide nutzen; Aufrufer liest, dann Unload |
| Dropdown ist leer | Im aufrufenden Makro gefüllt, nicht im Formular | In UserForm_Initialize befüllen |
| „Objekt erforderlich" beim Formularnamen | Steuerelement vor dem Laden des Formulars angesprochen | Erst Formular zeigen oder über die Formularvariable lesen |
Code nach .Show läuft zu früh |
Formular versehentlich vbModeless gezeigt |
Einfaches .Show (modal) zur Dateneingabe |
| OK und Abbrechen nicht unterscheidbar | Keine Markierung bei Abbrechen gesetzt | Me.Tag = "cancel" (oder ein öffentliches Boolean) vor dem Ausblenden setzen |
| Das rote ✕ verhält sich wie OK | QueryClose nicht behandelt |
Das ✕ in UserForm_QueryClose als Abbrechen behandeln |
Ein Formular ist viel Gerüst für „frag mich drei Dinge"
UserForms sind das richtige Werkzeug für echte Dateneingabe — aber die Steuerelemente, das Initialize, der Hide-gegen-Unload-Tanz und die Prüfung sind viel Verdrahtung, bevor eine einzige Zeile gespeichert wird. Wenn das Ziel nur „Name, Menge und Abteilung erfassen und als Zeile anhängen" ist, lässt Sie ExcelMaster Agent es in klarem Deutsch beschreiben und baut den Eingabeablauf und das Zurückschreiben für Sie — kein Formularmodul zu pflegen. Kostenlos testen →
Weitere Anleitungen
- VBA MsgBox in Excel — Ja/Nein, Schaltflächen & die Klammer-Regel
- VBA InputBox in Excel — die zwei InputBoxen & wann welche
- VBA Range in Excel — Zellen ansprechen, lesen & schreiben
- VBA For-Schleife in Excel — 8 Praxisbeispiele
FAQ
Was ist ein UserForm in VBA?
Ein UserForm ist ein eigener Dialog, den Sie im VBA-Editor entwerfen und mit Ereigniscode steuern. Sie ziehen Steuerelemente darauf (Textfelder, Kombinationsfelder, Schaltflächen), schreiben für jede mögliche Nutzeraktion eine Prozedur und zeigen es mit .Show. So sammelt VBA mehrere Eingaben zugleich — über das hinaus, was MsgBox oder InputBox können.
Wie erstelle ich ein UserForm in Excel VBA?
Alt+F11 drücken, dann Einfügen ▸ UserForm. Steuerelemente aus der Werkzeugsammlung daraufziehen, im Eigenschaftenfenster benennen und eine Schaltfläche doppelklicken, um ihr _Click-Ereignis zu schreiben. Das Formular aus einem normalen Modul mit frmName.Show anzeigen.
Warum ist mein UserForm-Textfeld leer, nachdem der Nutzer getippt hat?
Weil Sie Unload Me in der OK-Schaltfläche aufgerufen haben, was das Formular zerstört und alle Steuerelemente leert. Nutzen Sie stattdessen Me.Hide im OK-Ereignis — das hält das Formular (und seine Werte) im Speicher, damit der aufrufende Code frmName.txtName.Value lesen kann, danach Unload.
Was ist der Unterschied zwischen Unload Me und Me.Hide?
Me.Hide macht das Formular unsichtbar, hält es aber geladen, sodass seine Werte noch lesbar sind. Unload Me entfernt das Formular aus dem Speicher und setzt alle Steuerelemente zurück. Nutzen Sie Hide, wenn Sie die Eingaben nach dem Schließen lesen müssen; Unload, wenn Sie wirklich fertig sind.
Wie fülle ich eine ComboBox in einem UserForm?
Befüllen Sie sie im Ereignis UserForm_Initialize, damit sie vor dem Erscheinen bereit ist: cboDept.List = Array("Vertrieb", "Finanzen", "Betrieb"), oder setzen Sie cboDept.RowSource = "Tabelle1!A1:A10", um sie an einen Zellbereich zu binden.
Sollte das Formular modal oder nicht-modal sein?
Nutzen Sie modal (das Standard-.Show) für die Dateneingabe — der Nutzer muss das Formular abschließen, bevor er etwas anderes tut, und Ihr Code wartet auf das Ergebnis. Nutzen Sie .Show vbModeless nur für ein schwebendes, werkzeugleistenartiges Formular, das der Nutzer beim Arbeiten am Blatt offen lässt.
