Steuerelement-Design ab Access 2010

Mit Access 2010 hat Microsoft den Steuerelementen von Access einige neue Eigenschaften spendiert. Dabei können Sie die meisten Eigenschaften ganz einfach über die Benutzeroberfläche einstellen. Wer allerdings etwa Steuerelemente per VBA-Code zu Formularen hinzufügt oder diese in einem Rutsch anpassen möchte, muss Forschungsarbeit leisten: Die Zusammenhänge zwischen den Eigenschaften der Benutzeroberfläche und den entsprechenden VBA-Eigenschaften sind nämlich nicht auf den ersten Blick ersichtlich.

Voraussetzungen

Die in diesem Beitrag beschriebenen Techniken setzen mindestens Access 2010 voraus.

Neues ab Access 2010

Mit Access 2010 wurden einige neue Eigenschaften für Steuerelemente eingeführt. Dementsprechend wurden auch die Standardeigenschaften für die meisten Steuerelemente angepasst. Das ist leider hier und da etwas schiefgegangen … siehe beispielsweise Bild 1. Dort haben wir einem Formular eine Schaltfläche und eine Umschaltfläche hinzugefügt.

Beispielformular mit der zu bearbeitenden Schaltfläche

Bild 1: Beispielformular mit der zu bearbeitenden Schaltfläche

Während die Schaltfläche als gelungen bezeichnet werden kann, ist bei der Umschaltfläche scheinbar etwas schiefgelaufen: Sie sieht aus wie eine gezoomte Variante eines eigentlich viel kleineren Steuerelements und unterscheidet sich deutlich vom Design der Schaltfläche.

Umschaltfläche – was ist passiert

Wir werden nicht reproduzieren können, was Microsoft sich bei der Gestaltung dieses Steuerelements gedacht hat, dessen Design sich ja eigentlich an das der Schaltfläche anlehnen sollte. Interessanterweise hat Microsoft dieses scheinbare Problem noch nicht einmal in Access 2013 korrigiert – dort sieht die Umschaltfläche immer noch so wie im Sceenshot aus.

Aber es ist eine gute Möglichkeit, die Eigenschaften dieser beiden Steuerelemente zu untersuchen und herauszufinden, wie wir das Design der Umschaltfläche an das der Schaltfläche angleichen.

über die Benutzeroberfläche gelingt dies übrigens recht leicht: Sie müssen im Formularentwurf lediglich eine nach Ihren Wünschen formatierte Schaltfläche markieren, auf den Ribbon-Eintrag Start|Zwischenablage|Format übertragen klicken und dann die Umschaltfläche anklicken.

Schon sieht die Umschaltfläche genauso aus wie die herkömmliche Schaltfläche (s. Bild 2).

Die Umschaltfläche lässt sich leicht anpassen.

Bild 2: Die Umschaltfläche lässt sich leicht anpassen.

Unterschiede zwischen Steuerelementen

Wir könnten nun das Eigenschaftsfenster zu Rate ziehen und Eigenschaft für Eigenschaft die Werte für die Schaltfläche und die Umschaltfläche vergleichen. Das geht allerdings auch eleganter: Wir speichern das Formular zunächst unter dem gewünschten Namen und sichern dessen Code dann als Textdatei auf der Festplatte. Angenommen, das Formular heißt frmSchaltflaechen, dann verwenden wir die folgende Anweisung:

SaveAsText acForm, "frmSchaltflaechen", currentproject.Path & "\frmSchaltflaechen.txt"

Dies legt eine Textdatei im Verzeichnis der Datenbankdatei an. Diese öffnen wir und suchen uns die beiden Teile heraus, die mit Begin CommandButton beziehungsweise mit Begin ToggleButton beginnen. Kopieren Sie beide Teile und fügen Sie diese in neue Textdateien ein, erhalten Sie, wenn Sie diese nebeneinander positionieren, die Ansicht aus Bild 3.

Unterschiede der Eigenschaften von Umschaltfläche und Schaltfläche

Bild 3: Unterschiede der Eigenschaften von Umschaltfläche und Schaltfläche

Wie es aussieht, gibt es eine ganze Reihe von Eigenschaften, die wir uns ansehen müssen!

Formatierung per Benutzeroberfläche

Bevor wir uns die einzelnen VBA-Eigenschaften ansehen, werfen wir jedoch einen Blick auf die Möglichkeiten, welche die Benutzeroberfläche bietet. Diese finden Sie auf dem Ribbon-Tab Format, wenn Sie in der Entwurfsansicht eines Formulars auf eine Schaltfläche klicken.

Während Eigenschaften wie die zur Schriftformatierung sich nicht geändert haben, finden Sie in der Gruppe Steuerelementformatierung, die eigentlich recht unscheinbar aussieht, eine große Vielzahl neuer Möglichkeiten. Bild 4 zeigt die verschiedenen Einstellungen für alle Eigenschaften in aufgeklappter Form.

Möglichkeiten zum Formatieren von Schaltflächen

Bild 4: Möglichkeiten zum Formatieren von Schaltflächen

Designs analysieren

Wie aber erfahren wir nun, welche der vielen Einstellungen sich wie auf die VBA-Eigenschaften der betroffenen Steuerelemente auswirken Ganz einfach: Wir vergleichen einfach Eigenschaft für Eigenschaft zwischen zwei verschiedenen Designs. Natürlich soll dies nicht manuell geschehen – wir erledigen dies per VBA-Code. Dazu erstellen Sie ein neues Formular namens frmEigenschaften und fügen diesem eine Schaltfläche namens frmSchaltflaeche hinzu.

Außerdem benötigen wir eine Tabelle, in der wir die Eigenschaftswerte des Formulars vor und nach einer änderung speichern. Diese soll tblEigenschaften heißen und im Entwurf wie in Bild 5 aussehen. Wichtig ist, dass Sie für das Feld EigenschaftName einen eindeutigen Index definieren – auf diese Weise kann für jede Eigenschaft nur ein Satz von Werten gespeichert werden. Die beiden Felder EigenschaftWertAlt und EigenschaftWertNeu nehmen den vorherigen und den aktuellen Wert der Eigenschaft auf.

Tabelle zum Speichern der unterschiedlichen Eigenschaftswerte

Bild 5: Tabelle zum Speichern der unterschiedlichen Eigenschaftswerte

Für diese Tabelle erstellen Sie ein Unterformular namens sfmEigenschaften. Dieses zeigt die drei Felder EigenschaftName, EigenschaftWertAlt und EigenschaftWertNeu in der Datenblattansicht an.

Das Unterformular ziehen Sie in das bereits angelegte Formular frmEigenschaften. Die Kombination aus Haupt- und Unterformular sollte nun wie in Bild 6 aussehen.

Formular zum Ermitteln der Unterschiede zwischen zwei Designs

Bild 6: Formular zum Ermitteln der Unterschiede zwischen zwei Designs

Prozedur zum Speichern von Eigenschaften

Nun benötigen wir noch eine Prozedur, welche die aktuellen Eigenschaften der Schaltfläche frmSchaltflaeche in der Tabelle tblEigenschaften speichert. Diese lösen wir praktischerweise mit der einzigen Schaltfläche auf dem Formular aus. Die Prozedur sieht wie in Listing 1 aus. Sie füllt die Variable db mit einen Verweis auf die aktuelle Datenbank, um später die Execute-Methode nutzen zu können. Vor dem wenige Sekunden dauernden Durchlaufen und Speichern aller Eigenschaften zeigt die Prozedur den Mauszeiger als Sanduhr an und deaktiviert das Neuzeichnen des Formulars, da dieses sonst unnötig flackert. Diese beiden Einstellungen macht die Prozedur anschließend wieder rückgängig. Die Variable cmd wird mit einem Verweis auf die Schaltfläche cmdSchaltflaeche gefüllt. Die Eigenschaften müssen wir glücklicherweise nicht alle von Hand eintippen – wir können die Properties-Auflistung des CommandButton-Steuer-elements nutzen, um alle vorhandenen Eigenschaften in einer For Each-Schleife zu durchlaufen. Die Laufvariable prp dieser Schleife hat den Datentyp Property.

Private Sub cmdSchaltflaeche_Click()
     Dim prp As Property
     Dim cmd As CommandButton
     Dim strWertAlt As String
     Dim strWertNeu As String
     Dim db As DAO.Database
     Set db = CurrentDb
     DoCmd.Hourglass False
     Me.Painting = False
     Set cmd = Me!cmdSchaltflaeche
     For Each prp In cmd.Properties
         Select Case prp.Name
             Case "InSelection" ''nur in der Entwurfsansicht
             Case Else
                 On Error Resume Next
                 strWertAlt = Nz(DLookup("EigenschaftWertNeu", "tblEigenschaften", _
                     "EigenschaftName = ''" & prp.Name & "''"), "")
                 strWertNeu = Replace(Nz(prp.Value, ""), "''", "''''")
                 db.Execute "INSERT INTO tblEigenschaften(EigenschaftName, EigenschaftWertAlt, " _
                     & "EigenschaftWertNeu) VALUES(''" _
                     & prp.Name & "'', ''" & strWertAlt & "'', ''" & strWertNeu & "'')", dbFailOnError
                 Select Case Err.Number
                     Case 3022
                         db.Execute "UPDATE tblEigenschaften SET EigenschaftWertAlt = ''" & strWertAlt _
                             & "'', EigenschaftWertNeu = ''" & strWertNeu & "'' WHERE EigenschaftName = ''" _
                             & prp.Name & "''", dbFailOnError
                     Case 0
                     Case Else
                     Debug.Print Err.Number, Err.Description
                 End Select
                 On Error GoTo 0
         End Select
         Me!sfmSchaltflaechen.Form.Requery
     Next prp
     Me.Painting = True
     DoCmd.Hourglass False
End Sub

Listing 1: Aufzeichnen der Eigenschaften einer Schaltfläche

In dieser Schleife prüfen wir in einer Select Case-Bedingung den Namen der Property. Bei der Eigenschaft InSelection soll nichts geschehen, da diese Eigenschaft nur in der Entwurfsansicht verfügbar ist. Für alle übrigen Eigenschaften deaktiviert die Prozedur zunächst kurzzeitig die Fehlerbehandlung – den Hintergrund erfahren Sie gleich.

Die Prozedur speichert nun einen eventuell bereits im Feld EigenschaftWertNeu der Tabelle tblEigenschaften gespeicherten Wert für die aktuelle Eigenschaft in der Variablen strWertAlt. Den bereits vorhandenen Wert ermittelt die Prozedur per DLookup, wobei der mit prp.Name ermittelte Eigenschaftsname als Vergleichswert beim Kriterium dient. Den aktuellen Wert der Eigenschaft speichert die Prozedur in der Variablen strWertNeu. Dabei ersetzt die Prozedur gleich eventuell im Eigenschaftswert enthaltene einfache Anführungszeichen durch zwei einzelne Anführungszeichen.

Schließlich legt die folgende INSERT INTO-Aktionsabfrage einen neuen Datensatz in der Tabelle tblEigenschaften an, wobei der Name sowie der alte und der neue Eigenschaftswert in den entsprechenden Feldern landen.

Sobald die Eigenschaften erstmalig in die Tabelle eingetragen wurden, führt der Aufruf dieser SQL-Anweisung zu einem Fehler: Der Wert im Feld EigenschaftName ist dann nämlich bereits vorhanden. Da dieses Feld mit einem eindeutigen Index versehen ist, löst dies den Fehler 3022 aus. Der Datensatz wird in diesem Fall nicht angelegt.

Aber wir haben ja vorgesorgt: Durch das vorherige On Error Resume Next haben wir verhindert, dass der Fehler angezeigt wird. Und durch die Prüfung der Fehlernummer in der folgenden Select Case-Bedingung sorgen wir im Falle des Fehlers mit der Nummer 3022 dafür, dass eine weitere SQL-Aktionsabfrage ausgeführt wird.

Diese ersetzt die Werte der Felder EigenschaftWertAlt und EigenschaftWertNeu durch die in den Variablen strWertAlt und strWertNeu gespeicherten Werte – und zwar nur für den Datensatz mit der aktuell untersuchten Eigenschaft. Nach dem Durchlaufen aller Eigenschaften aktualisiert die Prozedur noch den Inhalt des Unterformulars, wodurch das komplette Formular nun wie in Bild 7 aussieht.

Formular zur Anzeige der alten und neuen Werte der Eigenschaften einer Schaltfläche

Bild 7: Formular zur Anzeige der alten und neuen Werte der Eigenschaften einer Schaltfläche

Fehlt noch eine Kleinigkeit, um die Unterschiede zu ermitteln: eine bedingte Formatierung, welche diejenigen Felder farbig markiert, bei denen der alte und der neue Wert nicht übereinstimmen. Alternativ können Sie den Inhalt des Unterformulars natürlich auch so filtern, dass nur die Datensätze mit unterschiedlichen Werten angezeigt werden.

Um die Datensätze mit unterschiedlichen Werten in den Feldern EigenschaftWertAlt und EigenschaftWertNeu farbig hervorzuheben, legen Sie für die beiden Textfelder EigenschaftWertAlt und EigenschaftWertNeu jeweils eine bedingte Formatierung an, für die Sie den folgenden Ausdruck hinterlegen:

[EigenschaftWertAlt]<>[EigenschaftWertNeu]

Im Formular der Beispieldatenbank haben wir außerdem noch ein Kontrollkästchen hinterlegt, welches nach der Aktualisierung die Prozedur aus Listing 2 auslöst.

Private Sub chkNurUnterschiedliche_Click()
     With Me!sfmEigenschaften.Form
         If Me!chkNurUnterschiedliche = True Then
             .Filter = "EigenschaftWertAlt <> EigenschaftWertNeu"
             .FilterOn = True
         Else
             .Filter = ""
         End If
     End With
End Sub

Listing 2: Filtern nach Datensätzen mit unterschiedlichen alten und neuen Werten

Wenn Sie die Schaltfläche nun, ausgehend von der Standardformatierung, mit einem neuen Farbverlauf versehen (Ribbon-Eintrag Format|Steuer-ele-ment-for-ma-tie-rung|Füll-effekt|Farb-ver-lauf|Linear diagonal), erscheint als einzige geänderte Eigenschaft die Eigenschaft Gradient (s. Bild 8).

Anzeige einer geänderten Eigenschaft

Bild 8: Anzeige einer geänderten Eigenschaft

Kleiner Tipp: Wenn Sie während der Experimente das Standarddesign wiederherstellen möchten, fügen Sie dem Formular eine frische Schaltfläche hinzu und übertragen ihre Formatierungen mit dem Ribbon-Befehl Start|Zwischenablage|Format übertragen.

Theme benutzen

Wenn Sie eine Datenbank öffnen, die mit einer älteren Version als Access 2010 erstellt wurde, und sich wundern, warum sich die änderungen einiger Eigenschaften per VBA nicht auswirken, liegt es vermutlich an der Eigenschaft UseTheme (im Eigenschaftsfenster: Design verwenden). Diese wurde erst mit Access 2010 eingeführt und ist dementsprechend für Steuerelemente in Datenbanken älterer Versionen standardmäßig auf den Wert 0 (False) eingestellt.

Wenn Sie die Designmöglichkeiten von Access 2010 nutzen möchten, können Sie die Eigenschaft per VBA oder über das Eigenschaftsfenster einstellen – oder durch die Auswahl eines der Ribbon-Einträge, welche die Verwendung eines Themes erfordern (also etwa durch Festlegen einer anderen Form als der rechteckigen).

Eigenschaften per VBA anpassen

Damit Sie im Beispielformular schnell mal eine Einstellung für eine Steuerelementeigenschaft ausprobieren können, haben wir dieser noch zwei Steuerelemente hinzugefügt.

Das Erste ist ein Kombinationsfeld und heißt cboEigenschaften. Es verwendet die folgende Abfrage als Datensatzherkunft:

SELECT EigenschaftID, EigenschaftName, EigenschaftWertAlt, EigenschaftWertNeu 
FROM tblEigenschaften 
ORDER BY EigenschaftName;

Das Kombinationsfeld soll nur das zweite Feld anzeigen, deshalb stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 4 und die Eigenschaft Spaltenbreiten auf 0cm;;0cm;0cm ein.

Nach dem Auswählen einer Eigenschaft aus der Tabelle tblEigenschaften (was voraussetzt, dass diese bereits gefüllt ist) soll das darunter befindliche Textfeld txtWert mit dem aktuellen Wert der Eigenschaft gefüllt werden.

Dies erledigt die folgende Prozedur:

Private Sub cboEigenschaft_AfterUpdate()
     Dim strWert As String
     strWert = Nz(Me!cboEigenschaft.Column(3))
     Me!txtWert = strWert
End Sub

über das Textfeld können Sie dann einen neuen Wert für die aktuell ausgewählte Eigenschaft einstellen.

Die folgende Prozedur wird durch das Ereignis Nach Aktualisierung des Textfeldes ausgelöst und stellt den Wert der ausgewählten Eigenschaft für die Beispielschaltfläche cmdSchaltflaeche auf den angegebenen Wert ein:

Private Sub txtWert_AfterUpdate()
     Me!cmdSchaltflaeche.Properties(Me!cboEigenschaft.Column(1)) = Me!txtWert
End Sub

Was bringt uns dies Zunächst können wir schnell mal die Wirkung verschiedener Eigenschaften ausprobieren. Außerdem bewirkt die Einstellung mancher Eigenschaften, dass automatisch weitere Eigenschaften angepasst werden – dies werden wir weiter unten sehen.

Wenn Sie dies schnell testen wollen, brauchen Sie nur die betroffene Eigenschaft zu ändern und können dann nach einem Klick auf die Schaltfläche cmdSchaltflaeche schnell prüfen, ob sich tatsächlich noch weitere Eigenschaften geändert haben. Wenn Sie so beispielsweise die Eigenschaft Back-ThemeColorIndex ändern, können Sie schnell feststellen, dass sich damit gleichzeitig die Eigenschaft BackColor ändert.

Damit Sie den eingegebenen Wert mit der Eingabetaste bestätigen und diesen gleich danach nochmals ändern können, haben wir noch eine weitere Prozedur hinzugefügt, die beim Betätigen der Eingabetaste ausgelöst wird:

Private Sub txtWert_KeyDown(KeyCode As Integer, Shift As Integer)
     Select Case KeyCode
         Case 13
             Me!txtWert = Me!txtWert.Text
             Call txtWert_AfterUpdate
             KeyCode = 0
     End Select
End Sub

Die Prozedur legt den aktuellen Text als Wert fest und ruft die Prozedur txtWert_AfterUpdate auf. Durch das Einstellen von KeyCode auf 0 bleibt die Einfügemarke im Textfeld txtWert.

Designeinstellungen per VBA

Nachfolgend schauen wir uns an, wie Sie die verschiedenen Einstellungen, die Sie sonst über die Ribbon-Befehle des Design-Tabs erhalten, per VBA vornehmen können (s. Bild 9) beziehungsweise welche VBA-Eigenschaften durch die Einstellungen im Ribbon geändert werden.

ändern einer Eigenschaft direkt über das Formular

Bild 9: ändern einer Eigenschaft direkt über das Formular

Schnellformatvorlagen

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