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.
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).
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.
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.
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.
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.
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.