Im Artikel Bedingte Formatierung haben Sie in Ausgabe 11/2011 erfahren, wie Sie die bedingte Formatierung einsetzen, um die Steuer-elemente in Formularen und Datenblättern in Abhängigkeit ihrer Werte mit bestimmten Formatierungen zu versehen – beispielsweise, um kritische Zahlenwerte mit einem roten Hintergrund zu versehen. Zwar können Sie seit Access 2010 bis zu 50 bedingte Formatierungen je Feld definieren, aber wer möchte das schon von Hand erledigen Zu Glück können Sie auf diese Technik auch per VBA zugreifen und so die Formatierungen mit etwas mehr Hirnschmalz, aber weniger Handarbeit definieren.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1805_BedingteFormatierungPerVBA.accdb.
Wunderwaffe VBA
Fast alles, was Sie unter Access über die Benutzeroberfläche erledigen können, lässt sich unter VBA regeln. In vielen Fällen ist das sehr hilfreich, vor allem dann, wenn Sie sich damit oft wiederholender oder umfangreicher Aufgaben entledigen können. Und das Setzen vieler bedingter Formatierungen für die Steuer-elemente etwa eines Formulars oder Berichts ist eine der Aufgaben, die man lieber nicht von Hand erledigt.
Stattdessen könnte man die Zeit viel besser in die Programmierung stecken – zum Beispiel, um das Festlegen von bedingten Formatierungen zu automatisieren.
Erst lesen, dann schreiben
Um ins Thema einzusteigen, legen wir einmal zwei verschiedene Formatierungen für ein Feld eines Formulars in der Datenblattansicht an. Das Formular heißt frmArtikel und soll alle Datensätze der Tabelle tblArtikel anzeigen (siehe Bild 1). Wir wollen zunächst das Feld Lagerbestand mit einer bedingten Formatierung ausstatten, die dafür sorgt, dass das Feld rot angezeigt wird, wenn der Lagerbestand den Wert 0 aufweist. Dazu wählen wir aus dem Kontextmenü dieses Textfeldes den Eintrag Bedingte Formatierung aus und klicken im nun erscheinenden Dialog Manager für Regeln zur bedingten Formatierung auf die Schaltfläche Neue Regel.
Bild 1: Formular-Entwurf unseres Beispielformulars
Dies öffnet den Dialog Neue Formatierungsregel, dem wir den Operator Gleich und den Vergleichswert 0 zuweisen. Außerdem stellen wir als Hintergrundfarbe die rote Farbe ein (siehe Bild 2).
Bild 2: Anlegen einer neuen bedingten Formatierung
Nach dem Mausklick auf die Schaltfläche OK schließt sich der Dialog und die neue Formatierungsregel wird in der Liste der Formatierungsregeln um aufrufenden Dialog angezeigt (siehe Bild 3).
Bild 3: Liste der angelegten Formatierungsregeln
Für die übrigen Steuer-elemente legen wir noch eine weitere Formatierungsregel an, welche die übrigen Steuer-elemente mit Ausnahme des Kontrollkästchens für das Feld Auslaufartikel ebenfalls rot färbt, wenn das Feld Lagerbestand den Wert 0 annimmt.
Hierbei ist interessant, dass beim Markieren mehrerer Steuerelemente gleichzeitig der Befehl Bedingte Formatierung nicht mehr im Kontextmenü vorhanden ist, aber immer noch im Ribbon unter Format|Steuerelement-formatierung|Bedingte Formatierung erscheint. Für diese Felder legen wir eine bedingte Formatierung an, welche den Ausdruck [Lagerbestand]=0 enthält und dabei den Hintergrund rot färbt (siehe Bild 4). Damit haben wir nun Spielmaterial, das wir per VBA erforschen können.
Bild 4: Anlegen einer weiteren neuen bedingten Formatierung
Bedingte Formatierung per VBA
Wir gehen davon aus, dass es unter VBA der Benutzeroberfläche zum Anlegen bedingter Formatierungen entsprechende Elemente gibt – also beispielsweise eine Auflistung aller bedingten Formatierungen und auch ein Objekt, das eine einzelne bedingte Formatierung bereitstellt und ihre Bearbeitung ermöglicht. Die Auflistung sollte ihrerseits das Hinzufügen, Referenzieren oder Entfernen von bedingten Formatierungen erlauben. Also werfen wir einen Blick in den Objektkatalog des VBA-Editors und suchen nach einem Schlüsselwort wie etwa Format.
Im ersten Schritt finden wir so schon einmal die drei Eigenschaften namens ConditionalFormats für die Steuer-elemente TextBox, ComboBox und NavigationControl (siehe Bild 5).
Bild 5: Suche nach der Auflistung mit dem bedingten Formatierungen
Klicken wir hier auf den Link mit der Beschriftung FormatConditions im unteren Bereich, landen wir schnel bei der Auflistung FormatConditions mit den Methoden Add und Delete und den Eigenschaften Count, Item und Parent und direkt darüber entdecken wir die Klasse FormatCondition (siehe Bild 6). Hier finden wir alles, was wir brauchen, um die Schritte zum Hinzufügen und Auslesen von bedingten Formatierungen nachzubilden.
Bild 6: Die Klasse FormatCondition mit ihre Eigenschaften
Bedingte Formatierungen auslesen
Als Erstes lesen wir einmal die bereits angelegten bedingten Formatierungen aus. Dazu fügen wir dem VBA-Projekt der Beispieldatenbank ein neues Standardmodul namens mdlBedingteFormatierung hinzu.
Hier legen wir dann eine Prozedur namens BedingteFormatierungenLesen an. Diese soll unser Beispielformular öffnen, die Steuerelemente durchlaufen und die Eigenschaften der für die Steuer-elemente definierten bedingten Formatierungen ausgeben.
Hinweis: Die Grundlagen zur folgenden Prozedur, mit der wir die Steuer-elemente eines Formulars durchlaufen, finden Sie im Artikel Steuerelemente per VBA referenzieren.
Die Prozedur finden Sie in Listing 1. Sie deklariert eine Variable namens frm für das zu untersuchende Formular und eine namens ctl für ein Control-Element, also ein allgemeines Steuer-element. Außerdem benötigen wir noch eine Variable, mit der wir beim Durchlaufen der Auflistung der bedingten Formatierungen den jeweils aktuellen Eintrag referenzieren können – diese heißt objFormatCondition und hat den Datentyp FormatCondition. Anschließend öffnen wir mit der OpenForm-Methode des DoCmd-Objekts das Formular frmArtikel und weisen dieses der Variablen frm zu. Auf diese Weise ist es später leichter zu handhaben. In einer ersten For Each-Schleife durchlaufen wir nun die Controls-Auflistung des mit frm referenzierten Formulars und weisen das jeweils aktuelle Control-Element der Variablen ctl zu.
Public Sub BedingteFormatierungenLesen() Dim frm As Form Dim ctl As Control Dim objFormatCondition As FormatCondition DoCmd.OpenForm "frmArtikel" Set frm = Forms!frmArtikel For Each ctl In frm.Controls Select Case ctl.ControlType Case acTextBox, acComboBox Debug.Print ctl.Name For Each objFormatCondition In ctl.FormatConditions Debug.Print " BackColor: " & objFormatCondition.BackColor Debug.Print " Enabled: " & objFormatCondition.Enabled Debug.Print " Expression1: " & objFormatCondition.Expression1 Debug.Print " Expression2: " & objFormatCondition.Expression2 Debug.Print " FontBold: " & objFormatCondition.FontBold Debug.Print " FontItalic: " & objFormatCondition.FontItalic Debug.Print " FontUnderline: " & objFormatCondition.FontUnderline Debug.Print " ForeColor: " & objFormatCondition.ForeColor Debug.Print " LongestBarLimit: " & objFormatCondition.LongestBarLimit Debug.Print " LongestBarValue: " & objFormatCondition.LongestBarValue Debug.Print " Operator: " & objFormatCondition.Operator Debug.Print " ShortestBarLimit: " & objFormatCondition.ShortestBarLimit Debug.Print " ShortestBarValue: " & objFormatCondition.ShortestBarValue Debug.Print " ShowBarOnly: " & objFormatCondition.ShowBarOnly Debug.Print " Type: " & objFormatCondition.Type Next objFormatCondition End Select Next ctl DoCmd.Close acForm, "frmArtikel" End Sub
Listing 1: Prozedur zum Ausgeben der Eigenschaften von bedingten Formatierungen
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: