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

VBA Controls in Excel — die Controls-Auflistung durchlaufen und Steuerelemente per Name ansprechen

|

VBA Controls in Excel — die Controls-Auflistung durchlaufen und Steuerelemente per Name ansprechen

Kurzfassung — Jedes Steuerelement auf einem UserForm lebt an einem einzigen Ort: in der Controls-Auflistung des Formulars. Sie erreichen sie als Me.Controls, durchlaufen sie mit For Each und sprechen jedes Steuerelement über seinen Namen als Zeichenfolge an — Me.Controls("txtName"). Genau diese Auflistung hält ein Formular mit zwanzig Feldern kurz: eine Schleife statt zwanzig benannter Zeilen. Filtern Sie mit TypeName oder TypeOf auf die Steuerelemente, die Sie meinen, denn die Auflistung enthält auch Labels, Frames und Schaltflächen.

Private Sub cmdClear_Click()
    Dim ctl As MSForms.Control
    ' Jede TextBox im Formular in einer Schleife leeren:
    For Each ctl In Me.Controls
        If TypeOf ctl Is MSForms.TextBox Then ctl.Value = ""
    Next ctl
End Sub

Ein einzelnes Steuerelement erreichen Sie, indem Sie seinen Namen tippen: txtName.Value, lstItems.Clear. Das funktioniert, wenn Sie das Steuerelement beim Schreiben des Codes bereits kennen. Die Controls-Auflistung ist für den Fall gedacht, dass Sie es nicht kennen — Sie wollen jede TextBox, oder ein Steuerelement, dessen Namen Sie erst zur Laufzeit zusammensetzen. Das ist die Drehscheibe der UserForm-Steuerelement-Familie, und die drei Anleitungen hier vervollständigen sie. Die Controls-Auflistung ist, wie Sie Steuerelemente im Paket ansprechen; eine TextBox liefert immer eine Zeichenfolge zurück, sodass eine eingetippte Zahl Text bleibt, bis Sie sie umwandeln; und ein Frame ist der Container, der einem Satz Optionsfelder seine eigene Gruppe gibt. Beherrschen Sie die Auflistung, die Zeichenfolge und den Container, und die einzelnen Steuerelemente — ListBox, ComboBox, CheckBox — lesen sich alle gleich: Ein Steuerelement ist ein Objekt, das Sie über das Formular erreichen und über seine Eigenschaften ansprechen.

Was Sie lernen

  • Was Me.Controls ist und warum ein Formular eher eine Auflistung als ein Bildschirm ist
  • Jedes Steuerelement mit For Each durchlaufen und gezielt auf die reagieren, die Sie meinen
  • Nach Typ filtern mit TypeName und TypeOf, damit Sie Labels und Frames überspringen
  • Ein Steuerelement über seinen Namen als Zeichenfolge ansprechen, für datengetriebene Formulare
  • Steuerelemente zur Laufzeit zu einem Formular hinzufügen
  • Die Ermessensfrage: wann eine Schleife zwanzig benannte Verweise schlägt

Das Denkmodell: ein Formular ist eine Auflistung von Steuerelement-Objekten

Ein UserForm sieht aus wie ein Bildschirm, aber für Ihren Code ist es eine Auflistung. Me.Controls ist genau diese Auflistung — jede TextBox, jedes Label, jede Schaltfläche, jeder Frame und jede ListBox, die Sie auf das Formular gezogen haben, gehalten als Objekte, die Sie zählen und durchlaufen können. Me.Controls.Count sagt Ihnen, wie viele es sind; Me.Controls(0) ist das erste (die Auflistung ist nullbasiert). Me ist das Formular, in dem der Code läuft, sodass im eigenen Modul eines UserForms Me.Controls und Controls dasselbe bedeuten.

MsgBox "This form has " & Me.Controls.Count & " controls"

Sobald Sie das Formular als Auflistung sehen, verschwinden die repetitiven Teile des Formularcodes. Sie hören auf, txt1, txt2, txt3 zu schreiben, und fangen an, eine Schleife zu schreiben.

Jedes Steuerelement durchlaufen mit For Each

For Each läuft die Auflistung ab. Die Steuerelement-Variable wird als MSForms.Control deklariert — der generische Typ, den sich jedes Steuerelement teilt:

Dim ctl As MSForms.Control
For Each ctl In Me.Controls
    Debug.Print ctl.Name
Next ctl

Das ist das Muster hinter « das Formular leeren », « jeden Wert einsammeln », « während der Arbeit alles deaktivieren ». Aber die Auflistung enthält alle Steuerelemente — auch die, die Sie nicht gemeint haben —, sodass eine blanke Schleife, die ctl.Value schreibt, beim ersten Label abstürzt, weil ein Label kein Value hat. Das ist das nächste Problem.

Nach Typ filtern mit TypeName und TypeOf

Nicht jedes Steuerelement hat die Eigenschaft, die Sie wollen. Ein Label hat kein .Value; ein CommandButton hat kein .Text. Erwischen Sie das falsche, bekommen Sie Laufzeitfehler 438, « Object doesn't support this property or method ». Also filtern Sie zuerst. TypeName(ctl) gibt den Typ als Zeichenfolge zurück; TypeOf ctl Is prüft ihn direkt:

For Each ctl In Me.Controls
    If TypeOf ctl Is MSForms.TextBox Then
        ctl.Value = ""                 ' sicher: nur TextBoxen erreichen diese Zeile
    End If
Next ctl

Verwenden Sie TypeOf ... Is in einem If — das ist die idiomatische Prüfung. Greifen Sie zu TypeName(ctl), wenn Sie den Typnamen in einer Meldung brauchen oder in einem Select Case über mehrere Typen. Die Regel: Rufen Sie in einem For Each über Controls nie eine Eigenschaft auf, ohne vorher nachgewiesen zu haben, dass das Steuerelement ein Typ ist, der sie besitzt.

Ein Steuerelement über seinen Namen ansprechen

Hier zahlt sich die Auflistung aus. Sie können sie über eine Namens-Zeichenfolge indizieren, und diese Zeichenfolge lässt sich zur Laufzeit zusammensetzen:

Dim i As Long
For i = 1 To 5
    Me.Controls("txtDay" & i).Value = ""   ' txtDay1 ... txtDay5
Next i

Ein Formular mit Feldern namens txtDay1 bis txtDay5 braucht eine Schleife, nicht fünf Zeilen. So funktionieren datengetriebene Formulare: Die Namen folgen einer Konvention, und der Code baut sie zusammen. Die Falle spiegelt die Application.Run- und CallByName-Falle aus der Reflection-Familie — der Name ist eine Zeichenfolge, sodass der Compiler ihn nicht prüfen kann. Ein Tippfehler wie "txtDya1" ist keine rote Schlangenlinie; er ist ein Laufzeitfehler, sobald die Zeile läuft. Bauen Sie den Namen aus einem bekannten Muster auf, und sichern Sie ihn mit On Error ab, falls ein Teil aus Daten stammt.

Steuerelemente zur Laufzeit zum Formular hinzufügen

Die Auflistung ist nicht starr. Controls.Add erzeugt ein Steuerelement, während das Formular geöffnet ist — so bauen Sie ein Formular, dessen Größe von den Daten abhängt: eine Zeile Felder pro Datensatz:

Dim box As MSForms.TextBox
Set box = Me.Controls.Add("Forms.TextBox.1", "txtDynamic", True)
box.Top = 10: box.Left = 10: box.Width = 120

Das erste Argument ist die Klasse des Steuerelements, das zweite sein Name, das dritte, ob es sichtbar ist. Dynamisch hinzugefügte Steuerelemente haben keine Code-Ereignisse, es sei denn, Sie verdrahten sie mit einer WithEvents-Klasse — eine echte Technik, aber eine, zu der Sie nur greifen sollten, wenn ein festes Layout die Aufgabe wirklich nicht lösen kann.

Die Ermessensfrage: wann eine Schleife zwanzig benannte Verweise schlägt

Die Controls-Auflistung ist mächtig, und genau das macht sie leicht zu überstrapazieren. Die ehrliche Regel: Haben Sie eine Handvoll Steuerelemente, die Sie namentlich kennen, ist txtName.Value klarer als Me.Controls("txtName").Value, und der Compiler prüft es mit. Die Schleife verdient ihren Platz, wenn die Steuerelemente viele und gleichförmig sind — zwanzig Tagesfelder, ein Raster von Eingaben, jede TextBox im Formular — oder wenn der Name wirklich von Daten entschieden wird. Eine Schleife über drei Steuerelemente ist Angeberei; eine Schleife über zwanzig ist der einzig vernünftige Weg, sie zu schreiben. Wählen Sie die Auflistung, wenn sie echte Wiederholung entfernt, nicht um zu beweisen, dass Sie es können.

Wie ExcelMaster hilft

Die Fehler hier sind leise und spät: ein For Each, das an dem einen vergessenen Label abstürzt, ein aus Daten gebauter Steuerelement-Name, der nicht mehr passt, eine Eigenschaft, die auf dem falschen Typ aufgerufen wird. Alle zeigen sich als derselbe Fehler 438 oder « nicht gefunden », zur Laufzeit, auf einem Formular, das fertig aussah.

ExcelMaster lässt Sie das Verhalten des Formulars in einfachen Worten beschreiben — « jede TextBox leeren », « alle Eingaben in eine Zeile einlesen », « fünf Tagesfelder aus einer Liste bauen » — und es schreibt die Controls-Schleife mit Typfilter und Namens-Absicherung bereits eingebaut. Sie behalten das Formular und den Code und sparen sich die Laufzeit-Jagd.

Häufig gestellte Fragen

Was ist die Controls-Auflistung in VBA?

Sie ist die Auflistung jedes Steuerelements auf einem UserForm, erreichbar als Me.Controls. Jedes Element ist ein Steuerelement-Objekt — eine TextBox, ein Label, eine Schaltfläche, ein Frame oder eine ListBox. Sie können sie mit .Count zählen, mit For Each durchlaufen und einzeln über den Index oder ihren Namen als Zeichenfolge ansprechen. Das ist der Standardweg, um viele Steuerelemente auf einmal zu behandeln, statt jedes einzeln zu benennen.

Wie durchlaufe ich alle Steuerelemente eines UserForms?

Deklarieren Sie eine Variable As MSForms.Control und verwenden Sie For Each ctl In Me.Controls. Prüfen Sie innerhalb der Schleife den Typ mit TypeOf ctl Is MSForms.TextBox, bevor Sie eine Eigenschaft anfassen, denn die Auflistung enthält auch Labels und Schaltflächen, denen diese Eigenschaft fehlt und die Fehler 438 auslösen würden.

Wie spreche ich ein Steuerelement über einen in einer Zeichenfolge gespeicherten Namen an?

Indizieren Sie die Auflistung mit der Zeichenfolge: Me.Controls("txtName"). Der Name lässt sich zur Laufzeit zusammensetzen, etwa Me.Controls("txtDay" & i). Weil der Name eine Zeichenfolge ist, wird ein Tippfehler erst bemerkt, wenn die Zeile läuft — sie löst einen « nicht gefunden »-Fehler aus —, bauen Sie den Namen also aus einem bekannten Muster auf und sichern Sie ihn ab.

Warum löst meine For-Each-Schleife über Controls Fehler 438 aus?

Weil Sie eine Eigenschaft aufgerufen haben, die das aktuelle Steuerelement nicht besitzt — am häufigsten .Value oder .Text auf einem Label, Frame oder CommandButton. Die Controls-Auflistung enthält jeden Typ, filtern Sie also mit TypeOf ctl Is MSForms.TextBox (oder dem Typ, den Sie meinen), bevor Sie diese Eigenschaft lesen oder schreiben.

Kann ich Steuerelemente hinzufügen, während das Formular läuft?

Ja. Me.Controls.Add("Forms.TextBox.1", "txtNew", True) erzeugt eines zur Laufzeit — so bauen Sie ein Formular, das auf die Datenmenge zugeschnitten ist. Setzen Sie danach Top, Left und Width. Dynamisch hinzugefügte Steuerelemente haben keine Ereignisbehandlung, es sei denn, Sie verbinden sie mit einer WithEvents-Klasse.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 28.09.2026.

Verwandte Anleitungen: VBA TextBox · VBA Frame · VBA UserForm · VBA ListBox · VBA ComboBox · VBA CheckBox · VBA On Error