Bedingte Formatierung unter Access 2010

Bei der bedingten Formatierung hat sich unter Access 2010 eine Menge getan. Nicht nur, dass Sie nun bis zu 50 verschiedene Formatierungen samt Bedingung festlegen können – nein, ab jetzt können Sie auch Balkendiagramme entsprechend der in einem Feld enthaltenen Daten in Formularen und Berichten anzeigen. Und natürlich hat Access im Unternehmen auch herausgefunden, wie Sie die 50 Formatierungen per VBA für alle Konstellationen anlegen – das schien bis jetzt durch einen Bug nicht möglich zu sein.

In der Tat hat Microsoft da wohl vergessen, irgendeinen kleinen Schalter umzulegen: Wenn Sie über die Benutzeroberfläche mehr als drei bedingte Formatierungen anlegen, gelingt dies ohne Probleme.

Sollten Sie dies jedoch unter bestimmten Bedingungen per VBA probieren, was ja gerade bei bis zu 50 verschiedenen Formatierungen sinnvoll wäre, scheitern Sie bereits nach dem dritten Eintrag in die Formate-Liste. Doch eins nach dem anderen!

Anzahl bedingter Formatierungen erhöht

Unter Access 2010 können Sie nun nicht mehr nur drei, sondern gleich bis zu 50 bedingte Formatierungen definieren. Ein Beispiel für die neue Pracht zeigt Bild 1. Wir haben dort für jede KategorieID eine eigene bedingte Formatierung angelegt.

pic001.png

Bild 1: Das Kategorien-Feld zeigt für jede Kategorie eine andere Hintergrundfarbe an.

Wenn Sie das unter Access 2010 von Hand erledigen wollen, öffnen Sie das Formular oder den Bericht in der Entwurfsansicht und wählen im Ribbon den Eintrag Format|Steuerelementformatierung|Bedingte Formatierung an.

Alternativ ändern Sie die bedingte Formatierung zur Laufzeit, dann aber nur in der Datenblattansicht, und zwar im Ribbon-Bereich Datenblatt|Formatierung|Bedingte Formatierung. In den übrigen Ansichten lässt sich Access nicht zur Anzeige des Dialogs aus Bild 2 überreden.

pic002.png

Bild 2: Anlegen bedingter Formatierungen für ein Steuerelement

Nicht nur, dass ein entsprechender Eintrag zum Aufruf des Dialogs fehlt – auch das Absetzen eines RunCommand acCmdConditionalFormatting bringt den Dialog nicht zum Vorschein.

Doch schauen wir uns zunächst das Anlegen einer bedingten Formatierung an. Dazu klicken Sie im Manager für Regeln zur bedingten Formatierung auf die Schaltfläche Neue Regel.

Im nun erscheinenden Dialog geben Sie weitgehend die gleichen Informationen ein wie bereits in früheren Access-Versionen (s. Bild 3).

pic004.png

Bild 4: Einsatz von mehr als drei verschiedenen bedingten Formatierungen

Dabei gibt es grundsätzlich die folgenden Optionen:

  • Feldwert ist: Erlaubt die Angabe eines Vergleichsoperators und eines Vergleichswertes, mit dem Sie den jeweils angezeigten Feldwert in Relation stellen können.
  • Ausdruck ist: Ermöglicht das Eintragen eines beliebigen Ausdrucks. Beachten Sie, dass Sie Feldnamen in eckige Klammern setzen.
  • Feld hat Focus: Sorgt dafür, dass das jeweils aktive Feld mit der bedingten Formatierung ausgezeichnet wird.

Die Formatierungsmöglichkeiten haben sich nicht geändert. Neu ist hingegen im oberen Bereich die Möglichkeit, neben dem bisher bekannten Werte im aktuellen Datensatz prüfen oder einen Ausdruck verwenden auch noch die Variante Mit anderen Datensätzen vergleichen zu wählen – diese Option besprechen wir weiter unten.

Bis zu 50 Formatierungen …

Zunächst einmal probieren wir aus, was Microsoft für Access 2010 verspricht: Sie können nun bis zu 50 bedingte Formatierungen für ein Steuerelement definieren! Dass dies tatsächlich funktioniert, erkennen Sie ansatzweise in Bild 4 (wer die gedruckte Version dieses Beitrags liest, mache sich im online verfügbaren PDF ein Bild der verwendeten Farben).

pic003.png

Bild 3: Anlegen einer bedingten Formatierung unter Access 2010

… auch per VBA

Die Prozedur aus Listing 1 versucht, nicht nur eine, zwei oder drei, sondern vier oder mehr Formatierungen zu einem Steuerelement hinzuzufügen. Dabei steht das Feld cboKategorieID im Mittelpunkt: Es soll für jeden Wert, also für jede Kategorie, eine andere Hintergrundfarbe anzeigen.

Listing 1: Versuch, vier und mehr Formatierungen hinzuzufügen

Public Sub BedingteFormatierung()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim frm As Form
    Dim strForm As String
    Dim strControl As String
    Dim ctl As Control
    Dim i As Integer
    Dim objFormatCondition As FormatCondition
    strForm = "sfmArtikel"
    strControl = "cboKategorieID"
    DoCmd.OpenForm strForm, acViewDesign
    Set frm = Forms(strForm)
    Set ctl = frm(strControl)
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT * FROM tblKategorien", dbOpenDynaset)
    Do While Not rst.EOF
        i = i + 1
        Set objFormatCondition = ctl.FormatConditions.Add(acFieldValue, acEqual, rst!KategorieID)
        With objFormatCondition
            .BackColor = Choose(i, 967423, 62207, ...weitere Farbwerte)
        End With
        rst.MoveNext
    Loop
End Sub

Dazu durchläuft die Prozedur eine Datensatzgruppe mit allen Datensätzen der Tabelle tblKategorien (was keine 50 Datensätze sind, aber immerhin deutlich mehr als drei). Das Zielformular sfmArtikel und das betroffene Steuerelement cboKategorieID werden über entsprechende Objektvariablen zugreifbar gemacht. In der Do While-Schleife über alle Datensätze der Tabelle tblKategorien erfolgt schließlich jeweils ein Aufruf der Add-Methode der FormatConditions-Auflistung, der jeweils eine neue bedingte Formatierung anlegen soll.

Dabei werden die Art der bedingten Formatierung (hier acFieldValue, dies entspricht der Auswahl der Option Feldwert ist des Dialogs), der Vergleichsoperator sowie der Vergleichswert angegeben (die jeweilige KategorieID).

Der Verweis auf die neu erstellte Formatierung wird in der Variablen objFormatCondition gespeichert. Damit lassen sich weitere Informationen festlegen – wie etwa die gewünschte Formatierung.

In diesem Fall beschränken wir uns darauf, schlicht die Hintergrundfarbe auf eine mit einer Choose-Anweisung bereitgestellte Farbe einzustellen. Dabei wird für den ersten Wert von KategorieID der erste Farbcode verwendet und so weiter.

Die Laufvariable i wird für jede Kategorie um 1 erhöht und sorgt so für das Auswählen des jeweiligen Farbcodes aus der Liste.

Nach dem Start der Prozedur geschieht erstmal nichts. Ein Wechsel in die Formularansicht zeigt jedoch, dass das Anlegen der mehr als drei bedingten Formatierungen durchaus erfolgreich war.

Bug oder nicht Bug

Zu Beginn dieses Beitrags gingen wir jedoch darauf ein, dass es unter bestimmten Umständen nicht möglich sei, mehr als drei bedingte Formatierungen anzulegen.

Auch in diversen Newsgroups und Foren wurde von diesem Bug berichtet. In der Tat ist es so, dass Sie zwar einfache Vergleiche mit dem Feldwert per VBA anlegen können. Wenn Sie jedoch per VBA eine bedingte Formatierung auf Basis eines Ausdrucks anlegen möchten, tritt beim vierten Eintrag ein Fehler auf (s. Bild 5). Die fehlerhafte Anweisung sieht beispielsweise wie folgt aus:

pic005.png

Bild 5: Fehler beim Hinzufügen von mehr als drei bedingten Formatierungen mit Ausdruck

Set objFormatCondition = ctl.FormatConditions.Add(acExpression, , "[KategorieID] = " & i)

Dummerweise benötigt man bedingte Formatierungen mit dem Parameter acExpression eigentlich immer, wenn nicht gerade nur der Wert des aktuellen Steuerelements ausgewertet werden soll.

Wenn Sie also beispielsweise wie in Bild 6 alle Steuerelemente mit einer Formatierung ausstatten möchten, die vom Wert des Feldes KategorieID abhängt, müssen Sie für alle Steuerelemente außer dem, das an das Feld KategorieID gebunden ist, eine bedingte Formatierung mit acExpression anlegen.

pic006.png

Bild 6: Datenblatt mit kompletter bedingter Formatierung

Vier und mehr mit Ausdruck

Warum dies genau in dieser Konstellation auftritt, weiß wohl nur Microsoft. Es gibt jedoch eine Möglichkeit, dieses Problem zu umgehen – wenn auch nur mit einem kleinen Hack. Dazu legen Sie für das betroffene Steuerelement zunächst vier beliebige bedingte Formatierungen an. Sie können dies von Hand oder auch per VBA erledigen.

Letzteres ist einfacher, weil Sie nicht mehr manuell eingreifen müssen – das ist vor allem interessant, wenn Sie gleich alle Steuerelemente zur Anzeige eines Datensatzes mit bedingten Formatierungen ausstatten möchten.

Die Prozedur aus Listing 2 soll die Ansicht wie in der Abbildung herstellen – und zwar zur Laufzeit in der Datenblattansicht. Öffnen Sie das Formular sfmArtikel also zunächst und führen Sie dann die im Modul mdlBedingteFormatierung befindliche Prozedur BedingteFormatierungMehrAls50 aus.

Listing 2: Codegesteuertes Hinzufügen größerer Mengen bedingter Formatierungen

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