🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA UserForm in Excel — ein echtes Eingabeformular bauen

|

VBA UserForm in Excel — ein echtes Eingabeformular bauen

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:

  1. Der Entwurf — die Steuerelemente, die Sie daraufziehen (TextBox, ComboBox, CommandButton), einmal zur Entwurfszeit eingerichtet.
  2. Der EreigniscodePrivate Sub-Prozeduren im Modul des Formulars, eine je möglicher Nutzeraktion.
  3. Der AufruffrmEntry.Show aus 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

  1. Im VBA-Editor (Alt+F11) Einfügen ▸ UserForm. In den Eigenschaften (Name) auf frmEntry setzen — Formulare und Steuerelemente jetzt zu benennen erspart Ihnen später das TextBox1-, TextBox2-Chaos.
  2. Aus der Werkzeugsammlung daraufziehen: zwei TextBox (txtName, txtQty), eine ComboBox (cboDept) und zwei CommandButton (btnOK, btnCancel). Bezeichnungsfelder daneben setzen.
  3. 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 Me entfernt das Formular aus dem Speicher und setzt jedes Steuerelement auf leer zurück. Lesen Sie txtName.Value nach einem Unload, bekommen Sie "" — die Daten sind weg.
  • Me.Hide macht das Formular unsichtbar, lässt es aber im Speicher leben, Werte intakt. Die Ausführung kehrt zur Zeile nach .Show zurück, und der Aufrufer kann noch frmEntry.txtName.Value lesen.

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

.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

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.