window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-TCJTE9L38H');

Steuerelemente per VBA referenzieren

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie Formulare und Steuerelemente programmieren wollen, müssen Sie wissen, wie Sie diese referenzieren. Nicht immer geschieht dies vom Klassenmodul des Formulars selbst aus – manchmal wollen Sie vielleicht auch von anderen Formularen auf die Steuer-elemente eines anderen Formulars zugreifen oder auch von einer VBA-Prozedur in eine Standardmodul. Dieser Artikel zeigt, wie Sie die Unterformulare und Steuer-elemente eines Formulars referenzieren und auf diese zugreifen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1805_FormsControlsVBARead.accdb.

Innerhalb des Formulars

Im Artikel Formulare per VBA referenzieren haben Sie bereits erfahren, dass ein Formular ein Klassenmodul erhält, sobald Sie Ereignisprozeduren für das Formular oder die enthaltenen Steuer-elemente anlegen. In diesem Klassenmodul können Sie mit dem Schlüsselwort Me auf das Formular und seine Eigenschaften zugreifen, während Sie von außen auf andere Art auf das Formular zugreifen müssen. Für den Zugriff auf die in einem Formular enthaltenen Elemente wie Unterformulare oder andere Steuer-elemente gelten daher auch verschiedene Regeln, auch wenn Sie letztendlich auf das gleiche Element zugreifen wollen. Allerdings können wir das entschärfen, indem wir die Regeln dafür nochmal zusammenfassen. Wenn Sie also auf Steuer-elemente in einem Formular zugreifen wollen, verwenden Sie abhängig vom Ausgangspunkt die folgenden Referenzen für das Formular:

Im eigenen Klassenformular:

Me...

Von außen:

Forms!...
Forms("")...

Etwas komplizierter wird es noch, wenn sich die zu referenzierenden Steuer-elemente in einem Unterformular befinden – dazu jedoch später mehr.

über den Namen auf ein Steuer-element zugreifen

Die einfachste Methode, auf ein Steuer-element zuzugreifen, ist die über den Namen des Steuerelements. Dazu fügen wir dem Beispielformular frmBeispiel zwei Schaltflächen hinzu, von denen die zweite den Namen der ersten Schaltfläche ausgeben soll (siehe Bild 1). In der Ereignisprozedur, die durch die zweite Schaltfläche ausgelöst wird, referenzieren wir die erste Schaltfläche dann über die Syntax mit dem Ausrufezeichen und geben den Namen per MsgBox aus:

Schaltfläche zum Ermitteln des Namens einer anderen Schaltfläche

Bild 1: Schaltfläche zum Ermitteln des Namens einer anderen Schaltfläche

Private Sub cmdNameEinesSteuerelements_Click()
    MsgBox Me!cmdNameAnzeigen.Name
End Sub

Die zweite Möglichkeit ist die Angabe des Steuerelementnamens als Parameter des Me-Schlüsselworts:

MsgBox Me("cmdNameAnzeigen").Name

Dies ist allerdings auch nur möglich, weil die Auflistung Controls die Standardeigenschaft des mit dem Schlüsselwort Me referenzierten Objekts, in diesem Fall des Formulars, ist. Die ausgeschriebene Form dieser Schreibweise bezieht die Controls-Auflistung dann explizit mit ein:

MsgBox Me.Controls("cmdNameAnzeigen").Name

Dabei fällt mir ein, dass man mal prüfen könnte, welchen Typ das Schlüsselwort Me eigentlich hat. Ist es Form Nein: Es handelt sich um die Code behind-Klasse des Formulars selbst:

Debug.Print TypeName(Me)
  Form_frmBeispiel

Für weitere Experimente fügen wir dem Formular noch ein Textfeld namens txtBeispiel hinzu sowie eine weitere Schaltfläche namens cmdTextfeldAusgeben (siehe Bild 2). Den Inhalt des Textfeldes legen wir in einer Ereignisprozedur fest, die beim Laden des Formulars ausgelöst wird:

Neues Textfeld zum Experimentieren

Bild 2: Neues Textfeld zum Experimentieren

Private Sub Form_Load()
    Me!txtBeispiel = "Beispieltext"
End Sub

Warum Ausrufezeichen und kein Punkt

Theoretisch kommen Sie in den meisten Fällen auch ohne Fehler aus, wenn Sie zwischen Formularbezeichner (also etwa Me oder Forms!) und Steuerelementname den Punkt als Trennzeichen angeben. Warum aber verwenden wir hier so beharrlich das Ausrufezeichen Dieses sollten Sie immer dann nutzen, wenn Sie Elemente von Auflistungen referenzieren, die Sie selbst angelegt haben beziehungsweise anlegen können – also etwa Formulare (Forms!) oder Steuer-elemente in Formularen (Forms!!).

Zugriff auf Textfelder von verschiedenen Stellen

Wenn wir vom Formular selbst – in diesem Fall über die Schaltfläche cmdTextfeldAusgeben – auf den Inhalt dieses Textfeldes zugreifen wollen, verwenden wir, wie oben gelernt, das Schlüsselwort Me sowie das Ausrufezeichen und den Namen des Textfeldes:

Private Sub cmdTextfeldAusgeben_Click()
    MsgBox Me!txtBeispiel
End Sub

Tatsächlich ist dies wiederum eine Kurzform. Wir geben ja nicht das Textfeld txtBeispiel aus, sondern den Inhalt dieses Textfeldes. Die Kurzform funktioniert deshalb, weil die Eigenschaft Value des Textfeldes die Standardeigenschaft der Textfeld-Klasse ist. Ohne diese Kurzform müssten Sie also mit dem folgenden Asudruck arbeiten:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar