Dynamische Steuerelemente

Zusammenfassung

Lernen Sie alternative Formulare und Steuerelemente kennen.

Techniken

Formulare, VBA

Voraussetzungen

Access 97 und höher

Sascha Trowitzsch, Berlin

Der Access-Entwickler sucht ständig nach neuen Mitteln, die Oberfläche seiner Anwendungen ansprechender und funktioneller zu gestalten. ActiveX-Steuerelemente zum Nachrüsten gibt es wie Sand am Meer, doch bringen diese meist Probleme bei der Weitergabe mit sich. Aber warum in die Ferne schweifen Die MSForms-Library bringt eine ganze Reihe von Steuerelementen mit – und ist quasi Bestandteil von Access. Und das Beste: Diese Steuerelemente lassen sich sogar zur Laufzeit anlegen!

Access im Unternehmen hat schon in anderen Beiträgen auf die begrenzte Anzahl von Steuerelementen und deren Möglichkeiten in Access hingewiesen und Alternativen wie das TreeView, das ListView oder grafische Schaltflächen vorgestellt. Und das ist nur die Spitze des Eisbergs: Kommerzielle Steuerelemente und passende Eigenentwicklungen für alle möglichen Einsatzzwecke gibt es zuhauf. Das Problem ist die Weitergabe von Anwendungen, die solche Steuerelemente verwenden: Man handelt sich mit solchen Fremdsteuerelementen häufig Installations- oder Verweisprobleme ein. Dabei findet man in der Microsoft Forms Library eine Fundgrube von Steuerelementen vor, die mit jeder Access-Version inklusive der Runtime automatisch mitinstalliert werden. Auf den folgenden Seiten lernen Sie die Steuerelemente dieser Library kennen und erfahren, wie Sie diese unter Access einsetzen.

Unter Word und Excel sind sie gang und gäbe: Die UserForms der MSForms-Library (fm20.dll). Sie werden dort meist für benutzerdefinierte Dialoge eingesetzt. Im VBA-Projekt eines Word-Dokuments oder einer Excel-Arbeitsmappe lassen sie sich über den Menübefehl Einfügen/UserForm des VBA-Editors in das Projekt integrieren und können dann unter Zuhilfenahme des Fensters Werkzeugsammlung mit Steuerelementen versehen werden.

In Access-Datenbanken hingegen findet man nur sehr selten solche UserForms. Und das hat auch einen Grund: Der Menübefehl Einfügen/UserForm steht aus unerfindlichen Gründen im VBA-Editor von Access standardmäßig nicht zur Verfügung. Doch das lässt sich leicht ändern, wenn Sie die Menüleiste modifizieren: Dazu wählen Sie einfach den Eintrag Anpassen aus dem Kontextmenü der Menüleiste aus und fügen dem Menü Einfügen wie in Bild 1 den Eintrag UserForm hinzu. Ein Klick auf diesen Eintrag erzeugt dann ein neues UserForm und zeigt dessen Entwurf im Code-Bereich des VBA-Editors an.

Bild 1: UserForm-Eintrag zur Menüleiste hinzufügen

Ein UserForm ist genauso ein Formular wie das Access-eigene. Allerdings ist es kein Child-Fenster der MDI-Umgebung, sondern ein eigenständiges Fenster, das mit einem als modaler Dialog geöffneten Access-Formular verwandt ist. Steuerelemente fügen Sie ihm über eine eigene Werkzeugsammlung hinzu, die sichtbar wird, wenn die UserForm im Entwurf den Fokus hat.

Bild 2: UserForms im Projekt-Explorer

Sollte diese Toolbox nicht angezeigt werden, aktivieren Sie diese mit dem Menüeintrag Ansicht/Werkzeugsammlung des VBA-Editors. Im Projekt-Explorer finden Sie das UserForm in der erst jetzt sichtbaren Kategorie Formulare (siehe Bild 2). Diese Bezeichnung mag etwas irreführend sein, befinden sich doch die Access-Formulare in der Kategorie Microsoft Access Klassenobjekte.

Die UserForms sind im Objektmodell auch nicht Teil der Forms-Auflistung von Access, sondern haben eine eigene Auflistung: VBA.UserForms (Typ Object).

Haben Sie ein UserForm im Entwurf geöffnet, dann lässt es sich über den Ausführen-Pfeil der Menüleiste im Runtime-Modus öffnen. Mit einem Doppelklick auf eines der enthaltenen Steuerlemente oder das UserForm selbst gelangen Sie in dessen VBA-Code. Alternativ klicken Sie mit der rechten Maustaste im Projekt-Explorer auf den passenden Eintrag und wählen aus dem Kontextmenü den Eintrag Code anzeigen aus.

Pro UserForms

Warum und wann sollte man nun UserForms in Access-Datenbanken verwenden Ein Anwendungsfall sind kleine Dialoge und Meldungsfenster, für die ein Access-Formular eigentlich überdimensioniert ist. Ein UserForm ist spart viele Ressourcen, weil es keine Funktionalität zur Datenbindung enthält.

Ein anderer Grund sind die MSForms-Steuerelemente der Werkzeugsammlung, die teilweise über mehr Einstellmöglichkeiten verfügen (vor allem grafische) als die analogen Access-Steuerelemente und manchmal auch leichter zu programmieren sind.

Beispiele sind die Listbox, die Combobox, das Multipage-Element (Registerkarten) und das Image-Steuerelement. Den SpinButton oder die Scrollbar gibt es in Access erst gar nicht.

Eingebettete ActiveX-Steuerelemente funktionieren in UserForms besser als in Access-Formularen – dort verhalten Sie sich oft unerwartet oder sind gar nicht zu gebrauchen.

Die in Bild 3 dargestellte Werkzeugsammlung enthält übrigens noch die benutzerdefinierten Reiter “ActiveX” und “Neue Seite”. Wie Sie die Sammlung um neue Reiter oder Steuerelemente erweitern können, erläutert die Visual Basic-Hilfe unter Microsoft Forms-Referenz/übersicht zum Entwurf.

Bild 3: Werkzeugsammlung der MSForms-Steuerelemente

Wie Sie weiter unten sehen werden, lassen sich MSForms-Steuerelemente genauso gut in ein Access-Formular einbauen. Es ist allerdings einfacher, deren Eigenschaften über das Eigenschaftsfenster des VBA-Editors einzustellen, wenn sie in ein UserForm integriert sind.

Schließlich gibt es noch einen weiteren Grund für den Einsatz von UserForms: Sie können darin zur Laufzeit Steuerelemente erzeugen.

In Access-Formularen ist das nicht möglich, ohne diese in der Entwurfsansicht anzuzeigen, was in einer professionellen Anwendung nicht passieren sollte.

Hier behilft man sich oft mit einem vorher im Entwurf angelegten “Vorrat” von Steuerelementen, die zur Laufzeit sichtbar oder unsichtbar geschaltet werden. Weiter unten erfahren Sie, wie Sie MSForms-Steuerelemente zur Laufzeit erzeugen.

Contra UserForms

Was spricht gegen den Einsatz von UserForms Weder UserForms noch die Steuerelemente der MSForms-Bibliothek lassen sich so einfach wie die in Access eingebauten Formulare oder Steuerelemente an eine Datenherkunft binden.

Sie müssen grundsätzlich per VBA und Recordsets mit Daten aus Tabellen oder Abfragen gefüllt werden, was sie in dieser Hinsicht kompliziert und unflexibel macht.

Dass Sie ein entworfenes UserForm im VBA-Editor mit dem “Ausführen”-Pfeil öffnen können, wissen Sie bereits. Dem Benutzer einer fertigen Anwendung können Sie das natürlich nicht zumuten – dort müssen Sie Menüeinträge oder Schaltflächen zum öffnen von Elementen der Benutzerumgebung bereitstellen, die den notwendigen Code ausführen. Access-Formulare öffnet man in VBA mit dieser DoCmd-Methode:

DoCmd.OpenForm "frmXY"

Für UserForms existiert keine analoge Anweisung, aber es gibt drei alternative Möglichkeiten. Sie können eine neue Instanz der entsprechenden UserForm-Klasse instanzieren und sie anschließend mit der Methode Show anzeigen:

Dim oForm As Object
Set oForm = New frmUserForm1
oForm.Caption = "Ein Titel"
oForm.Show

Auf ähnliche Weise lässt sich auch die Load-Anweisung von VBA verwenden:

Load frmUserForm1
frmUserForm1.Show

Beide Lösungen haben aber den Nachteil, dass Sie den Namen des zu öffnenden Elements nicht per Variable übergeben können, wie es bei der DoCmd.OpenForm-Methode von Access möglich ist. Die trickreiche dritte Lösung gestattet aber auch dies:

Dim sName As String
sName ="frmUserForm1"
VBA.UserForms.Add(sName).Show vbModal

Die im Objektkatalog vorhandene, aber versteckte Methode Add der UserForms-Auflistung gibt eine neue Instanz des in sName angegebenen UserForms zurück.

Im Code-Beispiel ist die Methode Show noch mit dem Parameter vbModal versehen. Das bewirkt, dass das UserForm als modaler Dialog geöffnet wird, was die Ausführung des Codes an dieser Stelle anhält.

Das Schließen eines UserForms erledigt die Unload-Methode von VBA:

Unload frmUserForm1

Auch hier haben wir wieder den Nachteil, dass man die Instanz des Formulars nicht per String-Variable übergeben kann. Leider kennt das UserForms-Objekt auch kein Pendant zu Add wie etwa die von anderen Objekten bekannte Remove-Methode. Um dennoch das Entladen eines UserForms per Variable zu ermöglichen, ist ein Umweg über die kleine Routine aus Quellcode 1 nötig.

Quellcode 1: Namentlich benanntes UserForm schließen

Sub UnloadUserForm(sName As String)
    Dim i As Long
    
    For i = 0 To VBA.UserForms.Count
        If UserForms.Item(i).Name = sName Then
            Unload UserForms.Item(i)
            Exit For
        End If
    Next i
End Sub

Sie finden diese und die Prozedur zum öffnen eines UserForms im Modul mdlMSForms der Beispieldatenbank.

Die Steuerelemente der MSForms-Library sind fast ausschließlich ActiveX-Komponenten. Als solche können Sie diese über den Menübefehl Einfügen/ActiveX-Steuerelement… in die Entwurfsansicht eines Formulars oder Berichts eingefügen. Wenn Sie diesen Menübefehl aufrufen, finden Sie die MSForms-Steuerelemente in der Liste der ActiveX-Komponenten unter Microsoft Forms 2.0 …. Die Beispieldatenbank enthält ein Formular namens frmAllControls, das alle derart verfügbaren Steuerelemente enthält. Sehen Sie es sich an, um eine übersicht zu erhalten.

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar