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.

Gelegentlich hört man, dass es Probleme mit diesen Steuerelementen beim Einsatz in Access-Formularen gebe. Ich selbst konnte derlei noch in keiner Access-Version feststellen oder reproduzieren.

Eigenschaften der Steuerelemente einstellen

Die Eigenschaften der Steuerelemente lassen sich nur recht unkomfortabel einstellen. Im Eigenschaftsfenster von Access findet sich auf der Registerseite Andere jeweils nur eine Auswahl der tatsächlich vorhandenen Eigenschaften. Leider fördert auch ein Klick auf die …-Schaltfläche der Eigenschaft Benutzerdefiniert keine weiteren Eigenschaften zutage, wie man dies von anderen ActiveX-Steuerelementen gewohnt ist.

MSForms-Steuerelemente bearbeiten

Es gibt zwei Möglichkeiten, um ein MS-Forms-Steuerelement zum Bearbeiten vorzubereiten:

Die erste liefert der Eintrag [Steuerelementname]-Objekt/Bearbeiten (wobei [Steuerelementname] durch die Bezeichnung des jeweiligen Objekts wie in Bild 4 zu ersetzen ist).

Bild 4: Editieren eines MSForms-Labels

Ein Doppelklick auf das Steuerelement bewirkt dasselbe. Es bekommt dabei einen schraffierten Rahmen, der den Bearbeitungsmodus andeuten soll.

Je nach Steuerelement sieht dieses Bearbeiten anders aus: Bei Textboxen, Labels oder Buttons kann man lediglich die Beschriftung oder den Textinhalt eingeben. Beim Rahmensteuerelement (Frame) oder der Multipage (Register) lässt sich jedoch über ein weiteres Kontextmenü ein MSForms-Eigenschaftsfenster öffnen (siehe Bild 5).

Bild 5: Kontextmenü des MSForms-Multipage-Steuerelements

Die dort aufgeführten Eigenschaften lassen sich nicht wie gewohnt direkt editieren. Stattdessen markiert man eine Zeile und stellt mit dem Steuerelement im oberen Bereich des Eigenschaftsfensters den gewünschten Wert ein beziehungsweise wählt diesen aus (siehe Bild 6).

Bild 6: MSForms-Eigenschaftenfenster zum Multipage-Steuerelement als Popupfenster

Einfacher als die nicht gerade intuitive Anpassung der MSForms-Steuerelemente ist der Weg über den VBA-Editor: Dieser bietet ebenfalls ein Eigenschaftsfenster (Ansicht/Eigenschaftsfenster oder F4), das die Eigenschaften des aktuell im Access-Fenster markierten Objekts oder Steuerelements anzeigt. Am Besten funktioniert dies, wenn Sie zwei Monitore zur Verfügung haben und auf dem einen Bildschirm den Formularentwurf und im anderen den VBA-Editor anzeigen.

Die Beispieldatenbank verdeutlicht die Features rund um die MSForms-Bibliothek über verschiedene UserForms und Access-Formulare mit MSForms-Steuerelementen.

Die Datenbank zeigt nach dem öffnen zunächst ein Switchboard-Formular mit sieben Schaltflächen zum Aufrufen der verschiedenen Beispielformulare an.

UserForm per VBA öffnen

  • Schaltfläche 1 öffnet ein einfaches UserForm mit zwei Bezeichnungsfeldern. Sie demonstriert das öffnen eines UserForm per VBA (siehe auch die Prozedur ShowUserForm im Modul mdlMSForms).
  • Alle auf einen Streich

  • Schaltfläche 2 öffnet ein Access-Formular mit sämtlichen MSForms-Steuerelementen. Fast alle diese Steuerelemente können Grafiken anzeigen. Falls ihnen nicht bereits im Entwurf Icons (.ico) oder andere Grafikformate (.gif, .bmp, jpg) spendiert wurden, so kann dies zur Laufzeit durch Zuweisung eines StdPicture-Objekts an die Eigenschaft Picture geschehen:
  • Set CommandButton.Picture = LoadPicture("c:\meinbild.jpg")

    Davon macht auch die Ereignisprozedur Form_Load des Formulars Gebrauch.

    Alles im Rahmen

    Schaltfläche 3 öffnet das Formular frmMSFrame, in das ein MSForms-Rahmensteuerelement (Frame) eingebunden ist.

    Ein Frame ist ein Container für weitere Steuerelemente. Es verhält sich gewissermaßen genauso wie ein UserForm. In ein Access-Formular eingebaut simuliert es ein Unterformular. Wenn sie das Frame in der Entwurfsansicht doppelklicken, dann können Sie im Kontextmenü die Werkzeugsammlung aufrufen, mit deren Hilfe sie ihm die weiteren Steuerelemente verpassen. Anschließend stellen Sie deren Eigenschaften so wie im Entwurf eines UserForms im VBA-Editor ein.

    Erwähnenswert ist noch der Formularcode von frmMSFrame: Wenn Sie MSForms-Steuerelemente in ein Access-Formular aufnehmen, dann können Sie deren Ereignisprozeduren nicht im Eigenschaftsfenster von Access einstellen. Das ist bei allen ActiveX-Steuerelementen so. Stattdessen wählt man im VBA-Editor in der linken Combobox des Codefensters den Steuerelementnamen aus und bekommt dann in der rechten Combobox die Ereignisse präsentiert. Wählt man eines davon aus, entsteht automatisch der Rumpf für die passende Prozedur.

    Die Namen der in einen Frame eingebetteten Steuerelemente werden sie jedoch in diesen Auswahlfeldern vergeblich suchen, da sie untergeordnete Steuerelemente darstellen. Um dennoch Ereignisprozeduren für sie schreiben zu können, müssen Sie passende Objektvariablen im Code anlegen.

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

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar