Home > Artikel > Ausgabe 5/2018 > Bedingte Formatierung per VBA

Bedingte Formatierung per VBA

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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.

Formular-Entwurf unseres Beispielformulars

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

Anlegen einer neuen bedingten Formatierung

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

Liste der angelegten Formatierungsregeln

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.

Anlegen einer weiteren neuen bedingten Formatierung

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

Suche nach der Auflistung mit dem bedingten Formatierungen

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.

Die Klasse FormatCondition mit ihre Eigenschaften

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

Hier prüfen wir dann, ob ctl den Typ acTextBox oder acComboBox aufweist, also ob es sich um eine Textbox oder um ein Kombintaionsfeld handelt. Für Kontrollkästchen etwa können Sie nämlich keine bedingten Formatierungen festlegen. Damit wir wissen, zu welchem Steuer­element die nachfolgend ausgegebenen Eigenschaften der bedingten Formatierungen gehören, geben wir hier schon den Namen des Steuerelements im Direktbereich aus.

Damit können wir in die zweite For Each-Schleife über alle bedingten Formatierungen aus der Auflistung FormatConditions einsteigen, die jeweils in der Variablen objFormatCondition landen.

Von dieser geben wir die Inhalte aller Eigenschaften im Direktbereich des VBA-Editors aus. Die Programmierung der Ausgabe wird uns durch die Verwendung von IntelliSense erleichtert, was uns die verschiedenen Eigenschaften zur Auswahl anbietet (siehe Bild 7). Nach dem Durchlaufen aller bedingten Formatierungen aller Steuer­elemente wird das Formular schließlich wieder geschlossen. Das Ergebnis für zwei der Steuer­elemente finden Sie in Bild 8 vor.

Ausgabe der Eigenschaften für bedingte Formatierungen

Bild 7: Ausgabe der Eigenschaften für bedingte Formatierungen

Auswahl per IntelliSense

Bild 8: Auswahl per IntelliSense

Die Eigenschaften haben die folgenden Bedeutungen, wobei wir zunächst die möglichen Änderungen bei erfüllter Bedingung für Hintergrund und Schrift auflisten:

  • BackColor: Hintergrundfarbe, die beim Eintreten der Bedingung angezeigt werden soll.
  • Enabled: Gibt an, ob das Steuer­element bei Eintreten der Bedingung deaktiviert dargestellt werden soll.
  • FontBold: Gibt an, ob die Schrift fett dargestellt werden soll.
  • FontItalic: Gibt an, ob die Schrift kursiv dargestellt werden soll.
  • FontUnderline: Gibt an, ob die Schrift unterstrichen dargestellt werden soll.
  • ForeColor: Gibt die Schriftfarbe an.

Diese möglichen Formatierungen finden Sie im Dialog zum Anlegen und Bearbeiten von Formatierungsregeln, wenn oben der erste Regeltyp ausgewählt wurde (siehe Bild 9). In diesem Fall fragt der Dialog auch die Eigenschaften für die Bedingung ab, welche durch die folgenden VBA-Eigenschaften angegeben werden. Die Eigenschaft Type nimmt einen der Werte acDataBar (3), acExpression (1), acFieldHasFocus (2) oder acField­Value (0) an.

Format-Eigenschaften

Bild 9: Format-Eigenschaften

Der Wert acFieldValue wird gesetzt, wenn für die Bedingung Werte im aktuellen Datensatz geprüft werden und im ersten Kombinationsfeld der Wert Ausdruck ist ausgewählt ist. Der Wert acExpression wird gesetzt, wenn für die Bedingung Werte im aktuellen Datensatz geprüft werden und im ersten Kombinationsfeld der Wert Ausdruck ist ausgewählt ist. Der Wert acFieldHasFocus kommt zum Einsatz, wenn für die Bedingung Werte im aktuellen Datensatz geprüft werden und im ersten Kombinationsfeld der Wert Feld hat Fokus ausgewählt wurde.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!